【问题标题】:Post an empty body to REST API via HttpClient通过 HttpClient 将空正文发布到 REST API
【发布时间】:2011-12-15 23:56:53
【问题描述】:

我尝试调用的 API 要求我执行 POST 但正文为空。我是使用 WCF Web API HttpClient 的新手,我似乎无法找到可以使用空正文发布帖子的编写代码。我找到了对一些 HttpContent.CreateEmpty() 方法的引用,但我认为这不适用于 Web API HttpClient 代码,因为我似乎找不到该方法。

【问题讨论】:

标签: c# wcf httpclient wcf-web-api


【解决方案1】:

使用派生自HttpContentStringContentObjectContent,或者您可以使用null作为HttpContent

var response = await client.PostAsync(requestUri, null);

【讨论】:

  • 看起来只有 .NET framework 4.5 才有? msdn.microsoft.com/en-us/library/…
  • 它将随 WCF Web API 一起提供,但我认为一些“好的部分”将使其进入框架本身。
  • 为什么没有不需要HttpContent 类的重载方法?我们是否应该至少提供一些东西(甚至是一个空字符串)来发布 http 帖子?
  • 您可以使用null 作为HttpContent,这将不会在请求中发送任何正文,例如var response = await client.PostAsync(requestUri, null);
  • 5.0.0.0 版本中的Assembly System.Net.Http 仍然没有可以为空的HttpContent 参数,因此不应允许null。但它(仍然)似乎有效。我可以通过null!
【解决方案2】:

以前做过,简单点:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

【讨论】:

  • 这比接受的答案更干净,应该投赞成票。
【解决方案3】:

发现:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

将 null 添加到请求正文,这在 WSO2 上失败。替换为:

Task<HttpResponseMessage> task = client.PostAsync(url, new {});

并且工作。

【讨论】:

  • 我无法证实这一发现(但我不确定我的测试是否完全足够)。当我使用 null 内容发布到我自己的一个 API 并查看在 HttpRequestMessage 中找到的内容时,我似乎得到了零字节的长度。
【解决方案4】:

要解决此问题,请使用以下示例:

   using (var client = new HttpClient())
            {
                var stringContent = new StringContent(string.Empty);
                stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
                var response = client.PostAsync(url, stringContent).Result;
                var result = response.Content.ReadAsAsync<model>().Result;
            }

【讨论】:

    【解决方案5】:

    我认为如果您的网络方法没有参数或者它们都适合 URL 模板,它会自动执行此操作。

    例如此声明发送空正文:

      [OperationContract]
      [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
         RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
         BodyStyle = WebMessageBodyStyle.Wrapped)]
      void GetStatus(string emailAddress, out long statusMask);
    

    【讨论】:

    • 我正在尝试发送一个空的身体。 HttpClient.Post() 方法需要一个 URI 和一个 HttpContent 对象。当我不想发送任何东西时,我不是作为 HttpContent 传递的。
    • 所以你没有使用 WCF。这更容易: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://..."); request.Method = "POST"; HttpWebResponse 响应 = (HttpWebResponse)request.GetResponse(); ...你会得到响应
    • 我使用的是 HttpClient,而不是 HttpWebRequest。使用带有空字符串的 StringContent 有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2012-06-17
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多