Как выставить пустое значение C#

Мне нужно поместить данные из приложения 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. На странице сказано, что NULL значения принимаются. Как выставить нулевое значение? Является NULL значение недопустимо в этом случае?

2 ответа

Решение

Протокол 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(?), Я не знаю.

Другие вопросы по тегам