Отправка Json из c# на PHP-сайт методом POST

206
27 февраля 2019, 22:10

Помогите пожалуйста со следующим вопросом:

Есть приложение 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']

Answer 1

Есть два варианта отправки 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 - у меня был подобный ответ, отправляю туда.

Answer 2

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 и он вам распарсит вашу строку Надеюсь кто сюда наткнется, получит ответ на свой вопрос

Еще раз всем огромное спасибо за помощь! =)

READ ALSO
Индекс находится вне границ массива C#

Индекс находится вне границ массива C#

помогите, пожалуйста, решить проблемуВозникает в этом месте

220
Не работает Shown в C#

Не работает Shown в C#

Работаю сейчас в формах C#У меня есть две формы

193
Качество выводимого в picturebox изображения

Качество выводимого в picturebox изображения

Есть битмап размером 100x100 пикселей, он растягивается и отображается в pictureBox формы,и выглядит это следующим образом (пискели мыльные, нету...

200
Cоздание backend для сайта. Отличие от .NET, .NET Core, .NET Framework, .NET MVC

Cоздание backend для сайта. Отличие от .NET, .NET Core, .NET Framework, .NET MVC

Пишу backend на PHPСобираюсь перейти на C#

233