从C#项目连接到PHP API

时间:2018-07-03 13:30:49

标签: c# api asp.net-web-api postman

我有一个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 :(得分:2)

您不需要使用原始的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.NET将其序列化为JSON:

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

复制文件或内存流

查看Call a Web API from a .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);

答案 1 :(得分:1)

邮递员中有一个按钮,将为当前定义的请求生成代码。链接在这里: enter image description here

这就是代码的样子。您需要从Nuget中提取RestSharp enter image description here