【问题标题】:Connecting to PHP api from c# project从 c# 项目连接到 PHP api
【发布时间】:2018-07-03 13:30:49
【问题描述】:

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

【问题讨论】:

  • 你能分享一下你的 C# Action 的代码是怎样的吗?
  • 不需要需要使用原始 HttpWebRequest 对象来进行 HTTP 调用。检查重复,调用var content=new StringContent(postData,Encoding.UTF8, "application/json");var response=await httpClient.PostAsync(url,content);只需2行。如果您手动构造 JSON 字符串但使用例如 JSON.NET 序列化强类型对象,则为 3 行。
  • 如果您使用Microsoft.AspNet.WebApi.Client 中的PostAsJsonAsync 扩展方法,则只有一行。别管名字,这个包在 HttpClient 之上添加了格式化方法。它不是特定于 ASP.NET Web API

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


【解决方案1】:

您无需使用原始 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.NET 将其序列化为 JSON,而不是手动构建 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);

【讨论】:

  • HttpClient 中有很多好东西。如果您使用 .NET Core,您会发现它包含 很多 的性能和可靠性增强功能。查看 Scott Hanselman 的 articles 了解新功能
【解决方案2】:

Postman 中有一个按钮,可以为当前定义的请求生成代码。链接在这里:

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

【讨论】:

  • .NET 已经包含 HttpClient 时不需要使用 RestClient
  • 是的,您可以使用 HttpClient 或原始套接字类来执行此操作。当我与 Postman 来回调整请求时,我会使用此流程。添加 Nuget 包没什么大不了的,正如您在上面通过利用 Microsoft.AspNet.WebApi.Client 所展示的那样
  • 区别在于异步执行和线程安全。这是一个非常大的问题 - 你阻塞的越少,你旋转等待的次数越少,你使用的 CPU 越少 ==> 你需要更少的服务器来处理相同的负载。由于您提到了套接字,.NET Core 2.1 中的 HttpClient 获得了一个新的 SocketsHttpClientHandler,它通过使用 Span 和 Pipelines 来减少分配。结果是巨大的性能和内存改进。
  • RestSharp 提供异步方法。线程阻塞不消耗 CPU。 async/await 非常有用,默认情况下应该使用,当负载是一个问题但没有什么是免费的,并且不是每个情况都需要它
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多