Мне нужно поместить данные из приложения C # WinForms на страницу PHP. Я использую WebClient с примером кода ниже:
using (WebClient client = new WebClient())
{
NameValueCollection values = new NameValueCollection();
values.Add("menu_parent", null);
string URL = "http://192.168.20.152/test.php";
byte[] response = client.UploadValues(URL, values);
string responseString = Encoding.Default.GetString(response);
MessageBox.Show(responseString);
}
На стороне PHP я делаю простое условие IF, чтобы проверить, является ли menu_parent
NULL или нет с этим очень упрощенным кодом:
<?php
$parent = $_POST['menu_parent'];
if ($parent === null)
echo "menu_parent is null";
else
echo "menu_parent is: <".$parent.">"; // This prints out.
if (is_null($parent))
echo "menu_parent is also null";
else
echo "menu_parent is also: <".$parent.">" // This also prints out.
if ($parent === "")
echo "menu_parent is empty string"; // This also prints out.
else
echo "menu_parent is not empty";
?>
Проблема заключается в NULL
ценность menu_parent
преобразуется в пустую строку на странице PHP. Я проверил Страница MSDN о методе WebClient.UploadValues а также NameValueCollection class. На странице сказано, что NULL
значения принимаются. Как выставить нулевое значение? Является NULL
значение недопустимо в этом случае?
Протокол HTTP является текстовым протоколом, и поэтому вы не можете отправлять «нулевое» значение.
Предполагая, что вы используете JSON.net библиотека (хотя, вероятно, есть эквивалентные способы сделать это встроенным).
using (WebClient client = new WebClient())
{
var values = new Dictionary<string,object> { { "menu_parent",null } };
var parameterJson = JsonConvert.SerializeObject(values);
client.Headers.Add("Content-Type", "application/json");
string URL = "http://192.168.20.152/test.php";
byte[] response = client.UploadData(URL, Encoding.UTF8.GetBytes(parameterJson));
string responseString = Encoding.Default.GetString(response);
MessageBox.Show(responseString);
}
Тогда в PHP вы можете сделать:
$data = json_decode(file_get_contents('php://input'));
if ($data->menu_parent === null) {
//should work
}
Я всегда использую модель данных и отправляю ее как объект в C # после десериализации-сериализации с классом JsonConvert. Затем в PHP я всегда получаю его как объект и снова конвертирую в связанную модель. Таким образом, нет потери значения ключа NULL. Но «NameValueCollection» имеет равную модель данных в PHP (?), Я не знаю.