Помогите пожалуйста со следующим вопросом:
Есть приложение Xamarin которое отправляет данные на сайт методом POST, На сайте проверяю, если ли такой параметр POST но вот проверка не проходит, как будто и нет параметра, проверял отправку данных через метод GET все работает отлично.
В текущем примере на сериализацию пускаю отдельный класс, в котором есть сериализуемый мне класс KVMglob.korzinaModel
Реализация класса korzinaModel ниже
Код отправки данных на сервер
string json = JsonConvert.SerializeObject(KVMglob.korzinaModel);
HttpContent content = new StringContent(json);
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync(url, content);
HttpContent responseContent;
if (response.StatusCode == HttpStatusCode.OK)
{
responseContent = response.Content;
var json_new = await responseContent.ReadAsStringAsync();
}
Код класса, который сериализуется в JSON:
public class KorzinaModel
{
//...
public int TotalSum { get; set; }
//...
}
Обработчик на сайте PHP:
if(isset($_POST['TotalSum']))
{
echo "true post";
}
UPD
при конвертировании моего объекта в JSON StringContent(json), он имеет тип text/plain и в коде PHP метод $_POST['TotalSum'] не сработает, подскажите, каким образом тогда можно отправить данные, чтобы его можно было прочитать в PHP через переменную $_POST['TotalSum']
Есть два варианта отправки POST, вам нужно определиться какой вам больше подходит.
Первый вариант - это отправка данных через FormUrlEncodedContent, удобно для "плоских" данных вида ключ-значение.
Например, у вас есть плоский класс с десятками полей int или string:
public class MyRequest
{
public int Id { get; set; }
}
Процедура отправки:
public async Task<string> Send(object request)
{
var client = new HttpClient();
const string serverUrl = "https://localhost:44365/api/values";
var content = new FormUrlEncodedContent(request.AsDictionary().ToDictionary(x => x.Key, y => y.Value.ToString()));
var response = await client.PostAsync(serverUrl, content);
return await response.Content.ReadAsStringAsync();
}
(Где extension .AsDictionary() - можно посмотреть здесь)
И, например, если у вас на той стороне asp.net то приёмник - примитивный экшн:
[HttpPost]
public ActionResult<string> Post(MyRequest request)
{
}
Второй вариант - когда у вас MyRequest - объект с многими уровнями вложенности и очень хочется отправить через Json.
Отправка (сериализуем при помощи Json.Net):
public async Task<string> Send(object request)
{
var client = new HttpClient();
const string serverUrl = "https://localhost:44365/api/values";
var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
var response = await client.PostAsync(serverUrl, content);
return await response.Content.ReadAsStringAsync();
}
Приёмка:
[HttpPost]
public ActionResult<string> Post([FromBody]MyRequest request)
{
}
Если же у вас на той стороне сайт на PHP - то читайте php://input - у меня был подобный ответ, отправляю туда.
UPD что в итоге получилось) Код в C# не менял, так же сериализую свой класс в JSON
На стороне PHP обрабатываю данные следующим образом:
// получение данных в POST
$postData = file_get_contents('php://input');
// преобразование в JSON , параметр true означает, что преобразовать в ассоциативный массив
$data = json_decode($postData, true);
// пример получения данных из ассоциативного массива
// в моев случае это был 1 массив типа объекта и 1 параметр, это общая сумма
$Name_item=$data['ItemsBuy'][0]['Name']; //
$TotalSum=$data['TotalSum'];
ЗЫ Если возникло непонимание, почему мы не можете добраться до своих данных, то вот вам онлайн декодер JSON
http://freeonlinetools24.com/json-decode
Вставьте туда параметр $postData и он вам распарсит вашу строку
Надеюсь кто сюда наткнется, получит ответ на свой вопрос
Еще раз всем огромное спасибо за помощь! =)
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости