ChatGPT解决这个技术问题 Extra ChatGPT

通过 HttpClient 将空正文发布到 REST API

我试图调用的 API 需要一个带有空正文的 POST。我是使用 WCF Web API HttpClient 的新手,我似乎找不到正确的代码来发布一个空的正文。我找到了对一些 HttpContent.CreateEmpty() 方法的引用,但我不认为它适用于 Web API HttpClient 代码,因为我似乎找不到该方法。

HttpContent.CreateEmpty 来自旧的 HttpClient 原型,它是 REST Starter 工具包的一部分。不幸的是,新的 HttpClient 中没有等价物。
@MichaelFreidgeim如果时空连续体中有一个洞并且2013年以某种方式出现在2011年之前,那么是的,它可能是重复的。
“可能重复”是一种清理方法 - 关闭类似问题并保留最佳答案。日期不是必需的。请参阅 meta.stackexchange.com/questions/147643/… 如果您同意需要澄清,请在 meta.stackexchange.com/questions/281980/… 上投票

S
Soviut

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

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

看起来这仅在 .NET 框架 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 中的程序集 System.Net.Http 仍然没有可为空的 HttpContent 参数,因此不应允许 null。但它(仍然)似乎有效。我可以通过null!
O
Ogglas

以前做过,只是保持简单:

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

这比公认的答案更干净,应该投票。
E
Erik Philips

已经发现:

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

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

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

并且工作了。


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

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

   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;
            }

I
Ivan G.

如果您的网络方法没有参数或者它们都适合 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 有效。