【问题标题】:Sending json with .NET HttpClient to a WebAPI server使用 .NET HttpClient 将 json 发送到 WebAPI 服务器
【发布时间】:2014-09-12 00:17:15
【问题描述】:

我正在尝试使用 HttpClient 通过 POST 将 json 发送到我的网络服务。

发送方法真的很简单:

HttpClient _httpClient = new HttpClient(); 
public async Task<HttpStatusCode> SendAsync(Data data)
    {
        string jsonData = JsonConvert.SerializeObject(data);
        var content = new StringContent(
                jsonData,
                Encoding.UTF8,
                "application/json");
            HttpResponseMessage response = await _httpClient.PostAsync(_url, content);

            return response.StatusCode;
    }

在服务器端,我有 WebAPI 控制器,方法如下:

    [HttpPost]
    [ActionName("postdata")]
    public async Task<HttpResponseMessage> PostData([FromBody] string jsonParam)
    {
            /// here the jsonParam is null when receiving from HttpClient. 
            // jsonParam gets deserialized, etc
    }

这个方法中的jsonParam是nulljsonData 很好,如果我将其复制并粘贴到请求发件人(我使用邮递员)中,一切都会成功。

这是关于我如何构建内容和使用HttpClient,但我不知道出了什么问题。

谁能看到这个问题?

【问题讨论】:

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


    【解决方案1】:

    由于您尝试 POST json,因此您可以添加对 System.Net.Http.Formatting 的引用并直接发布“Data”,而无需对其进行序列化并创建 StringContent。

    public async Task<HttpStatusCode> SendAsync(Data data)
    {
            HttpResponseMessage response = await _httpClient.PostAsJsonAsync(_url, content);
    
            return response.StatusCode;
    }
    

    在您的接收方,您可以直接接收“数据”类型。

     [HttpPost]
        [ActionName("postdata")]
        public async Task<HttpResponseMessage> PostData(Data jsonParam)
        {
    
        }
    

    关于这些 HttpClientExtensions 方法的更多信息可以在这里找到 - http://msdn.microsoft.com/en-us/library/hh944521(v=vs.118).aspx

    【讨论】:

      【解决方案2】:

      发布单个简单类型时,您需要在帖子正文上使用特殊语法:

      =postBodyText
      

      您必须将Content-Type 更改为application/x-www-form-urlencoded

      参考:http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-1#sending_simple_types

      对于初学者来说,这应该可以:

      public async Task<HttpStatusCode> SendAsync(Data data)
      {
          string jsonData = string.Format("={0}", JsonConvert.SerializeObject(data));
          var content = new StringContent(
                  jsonData,
                  Encoding.UTF8,
                  "application/x-www-form-urlencoded");
              HttpResponseMessage response = await _httpClient.PostAsync(_url, content);
      
              return response.StatusCode;
      }
      

      或者,您可以在控制器中接收复杂类型而不是字符串。

      [HttpPost]
      [ActionName("postdata")]
      public async Task<HttpResponseMessage> PostData(Data data)
      {
          // do stuff with data: in this case your original client code should work
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-02
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-20
        相关资源
        最近更新 更多