通过HttpClient将空主体发布到REST API


118

我尝试调用的API要求我执行POST,但正文为空。我是使用WCF Web API HttpClient的新手,我似乎找不到要写空正文的写代码。我找到了对某些HttpContent.CreateEmpty()方法的引用,但我认为这不是针对Web API HttpClient代码的,因为我似乎找不到该方法。


HttpContent.CreateEmpty来自旧的HttpClient原型,该原型是REST Starter工具包的一部分。不幸的是,新的HttpClient中没有等效项。
Darrel Miller


1
@MichaelFreidgeim如果时空连续体中有一个空洞,而2013年在2011年之前出现,那么是的,它可能是重复的。
Ryan Rinaldi '18

1
“可能重复”是一种清理方法-关闭类似的问题,并为他们提供最佳答案。日期不是必需的。请参阅meta.stackexchange.com/questions/147643/…如果您同意需要澄清,请对meta.stackexchange.com/questions/281980/…
Michael Freidgeim,

Answers:


117

使用StringContentObjectContent源自HttpContent或可以null用作HttpContent

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


看起来这只是在.NET Framework 4.5中吗? msdn.microsoft.com/en-us/library/...

它将随WCF Web API一起提供,但我认为某些“好部分”将使它成为框架本身。
亚历山大·泽特勒

为什么没有任何不需要HttpContent类的重载方法?我们是否应该至少提供一些东西(甚至是一个空字符串)来发布http帖子?
tugberk 2012年

75
您可以将null用作HttpContent,这将不会在请求中发送任何正文,例如var response = await client.PostAsync(requestUri, null);
Owain Williams

105

之前做到这一点,只需保持简单即可:

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

7
这比公认的答案更干净,应该予以表决。
David Ebbo

4

发现:

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

向请求主体添加null,该主体在WSO2上失败。替换为:

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

和工作。


我无法证实这一发现(但是我不确定我的测试是否完全足够)。当我发布带有null内容的我自己的API之一并查看中找到的内容时HttpRequestMessage,我似乎得到的长度为零字节。
OR Mapper

1

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

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

-6

如果您的网络方法没有参数,或者它们都适合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 respose =(HttpWebResponse)request.GetResponse(); ...您得到回应
Ivan G.

1
我正在使用HttpClient,而不是HttpWebRequest。使用StringContent与空字符串一起工作。
瑞安·里纳尔迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.