我有一个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();
答案 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)