Подключение к PHP API из проекта C # - PullRequest
0 голосов
/ 03 июля 2018

У меня есть API

http://cbastest.cadvilpos.com/module/posmodule/customapi

с параметрами

{
    "action":4,
    "device_token": "3e8ea119a90ee6d2",
    "key":"9475962085b3a1b8c475d52.95782804",
    "shop":1,
    "language":1
  }

Это нормально работает в почтальоне. Но когда я пытаюсь подключиться из проекта c #, он показывает ошибку {"success":0,"error":"Missing the action parameter."}. Пожалуйста, дайте рабочий код C #, чтобы получить результат json.

Код, который я пробовал:

var request = (HttpWebRequest)WebRequest.Create("http://cbastest.cadvilpos.com/module/posmodule/customapi");
var postData = "{ 'action':'4', 'device_token':'3e8ea119a90ee6d2','key':'9475962085b3a1b8c475d52.95782804','shop':'1','language':'1'}";
var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

var response2 = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response2.GetResponseStream()).ReadToEnd();

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вам не нужно использовать необработанный объект HttpWebRequest для выполнения HTTP-вызова. HttpClient был введен в 2012 году для упрощения асинхронных HTTP-вызовов.

Вы можете сделать что-то простое, как:

var content=new StringContent(postData,Encoding.UTF8, "application/json");
HttpResponseMessage response=await httpClient.PostAsync(url,content);
//Now process the response
if (response.IsSuccessCode)
{
   var body=await response.Content.ReadAsStringAsync();
   var responseDTO=JsonConvert.DeserializeObject<MyDTO>(body);
}

Вместо того, чтобы создавать строку JSON вручную, вы можете использовать строго типизированный класс или анонимный объект и сериализовать его в JSON с JSON.NET:

var data=new {
    action=4,
    device_token="3e8ea119a90ee6d2",
    key = "9475962085b3a1b8c475d52.95782804",
    shop=1,
    language=1
};

var postData=JsonConvert.SerializeObject(data);
var content=new StringContent(postData,Encoding.UTF8, "application/json");
var response=await httpClient.PostAsync(url,content);
...

Вы можете прочитать тело ответа за один раз как строку, используя ReadAsStringAsync , или вы можете получить поток ответа с помощью ReadAsStreamAsync . Вы можете скопировать данные ответа непосредственно в другой поток, например, в файл или поток памяти с помощью HttpContent.CopyToAsync

Проверьте Вызовите веб-API из .NET Client для получения дополнительных примеров. Несмотря на заголовок, примеры работают для вызова любого HTTP / REST API.

Пакет Microsoft.AspNet.WebApi.Client, упомянутый в этой статье, - это еще одна вещь, которая применяется к любому вызову, а не только к вызовам ASP.NET Web API. Например, метод расширения PostAsJsonAsync объединяет сериализацию и отправку запроса на URL. С его помощью публикация действия DTO может быть сведена к одной строке:

var data=new {
    action=4,
    device_token="3e8ea119a90ee6d2",
    key = "9475962085b3a1b8c475d52.95782804",
    shop=1,
    language=1
};

var response=await httpClient.PostAsJsonAsync(url,data);
0 голосов
/ 03 июля 2018

В Почтальоне есть кнопка, которая генерирует код для текущего определенного запроса. Ссылка здесь: enter image description here

И вот как выглядит код. Вам нужно будет вытащить в RestSharp от Nuget enter image description here

...