Мой сервер работает с PHP и использует переменную $_POST. Мой клиент использует С#.
С ContentType = application/json мне нужно использовать $post = json_decode(file_get_contents('php://input'), true); на PHP-сервере
Но с ContentType = application/x-www-form-urlencoded переменная $_POST представляет собой массив со строкой json, например [ **the json variable as string** ]
Что не так с моим кодом, когда я использую application/x-www-form-urlencoded
Пример:
var post = new Dictionary<string, object>
{
["key1"] = "data1",
["key2"] = new List<string>{ "data2", "data3" }
};
Получить [ "[\"key1\"] = \"data1\" ... \"data3\"]" ] как $_POST (1 массив с 1 строкой)
Клиент С#:
var post = new Dictionary<string, object>
{
["key1"] = "data1",
["key2"] = new List<string>{ "data2", "data3" }
};
var url = "https://urlrandom.com";
var method = "POST";
using (var webClient = new WebClient())
{
webClient.Headers[HttpRequestHeader.UserAgent] = "Other";
webClient.Headers[HttpRequestHeader.Accept] = "application/json";
webClient.Headers[HttpRequestHeader.ContentType] = ; // "application/json" or "application/x-www-form-urlencoded"
var dataString = JsonConvert.SerializeObject(post);
var bytes = Encoding.UTF8.GetBytes(dataString);
var jsonBytes = webClient.UploadData(url, method, bytes);
var jsonString = Encoding.UTF8.GetString(jsonBytes);
var json = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
return json;
}
PHP-сервер:
<?php
echo array_key_exists($_POST, "key1"); /* false with application/x-www-form-urlencoded */
exit();
?>
Непонятно, с какой проблемой вы столкнулись с кодом С#. Можете объяснить немного больше?
P.S. application/x-www-form-urlencoded не так сложно понять... вы просто помещаете данные в формат строки запроса, например. param=x¶m2=42¶m3=abc ...и т.д. Это становится немного сложнее, если у вас есть сложный объект, но общая концепция не сложна.
Я не уверен, что UploadData установил ContentLengh правильное значение. Вам может потребоваться явно указать длину содержимого, чтобы клиент и сервер знали, сколько данных вы загружаете.
Я не думаю, что PHP будет автоматически декодировать ввод json. Проверьте stackoverflow.com/questions/18866571/receive-json-post-with-php/…, чтобы узнать, как вы можете сделать это вручную.
Пожалуйста, посмотрите мою правку, спасибо за вашу помощь
«Что не так с моим кодом, когда я использую application/x-www-form-urlencoded»… Что не так, вы сообщаете серверу, что собираетесь отправлять данные в одном формате, а затем отправляете данные в другом формат. Сервер сбит с толку этим. Он пытается интерпретировать данные в формате, закодированном по URL-адресу, но в итоге получает бессмыслицу, потому что на самом деле вместо этого вы отправляете JSON.
Если вы собираетесь отправлять данные в формате JSON, установите для заголовка типа контента значение «application/json». Если вы собираетесь отправлять данные в формате с кодировкой URL, установите для заголовка типа контента значение «application/x-www-form-urlencoded». Затем сервер может проверить заголовок и узнать, как правильно читать данные. Я надеюсь, что логика этого достаточно очевидна. Конечно, на сервере должен быть написан код, чтобы запустить этот тест и решить, что делать. в качестве альтернативы сервер может принять данные только в одном конкретном формате и выдать ошибку, если входные данные не соответствуют этому.
В вашем случае вы отправляете JSON, но затем пишете PHP-код, который пытается прочитать данные, как будто они закодированы в URL-адресе (независимо от заголовка типа контента, поскольку вы не проверяли его значение). Если вы хотите отправить JSON, то в PHP вам нужно прочитать JSON, используя json_decode(file_get_contents('php://input'), true); как вы уже сами упомянули. После этого вы можете использовать объект, возвращенный этим кодом, в качестве ваших данных в PHP. PHP не помещает данные JSON в обычную переменную $_POST, поэтому поиск там никогда не будет работать. Но вы умеете читать JSON... так в чем проблема??





вы декодируете JSON на PHP-сервере?