227

The API I'm trying to call requires a POST with an empty body. I'm using the WCF Web API HttpClient, and I can't find the right code that will post with an empty body. I found references to some HttpContent.CreateEmpty() method, but I don't think it’s for the Web API HttpClient code since I can't seem to find that method.

4

8 Answers 8

284

Use StringContent or ObjectContent which derive from HttpContent or you can use null as HttpContent:

var response = await client.PostAsync(requestUri, null);
Sign up to request clarification or add additional context in comments.

9 Comments

It looks like this is only in .NET framework 4.5? msdn.microsoft.com/en-us/library/…
It will ship with WCF Web API but I think some of the "good parts" will make it into the framework itself.
Why isn't there any overload methods which does not require a HttpContent class? Should we at least provide something (even an empty string) to make a http post?
You can use null as the HttpContent, this will send no body in the request, e.g. var response = await client.PostAsync(requestUri, null);
Assembly System.Net.Http in version 5.0.0.0 has still no nullable HttpContent parameter, so null should be not allowed. But it (still) seems to work. I could pass null!.
|
137

Did this before, just keep it simple:

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

1 Comment

This is cleaner than accepted answer, and should be voted up.
14

Have found that:

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

Adds null to the request body, which failed on WSO2. Replaced with:

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

And worked.

1 Comment

I cannot confirm this finding (but I am not sure my test was totally adequate). When I POST to one of my own APIs with a null content and look at the content found in the HttpRequestMessage, I seem to be getting a length of zero bytes.
2

In case you do not want to pass null value you can you the following:

Task<HttpResponseMessage> task = httpClient.PostAsync(uri, new StringContent(String.Empty));

But, beside this, as above already discussed you could pass null in there as a parameter.

Comments

2

If you wish to avoid 'null' and make your intentions clear, as do I, you can override the StringContent class:

    private sealed class DeliberatelyEmptyContent : StringContent
    {
        public DeliberatelyEmptyContent() : base(string.Empty)
        {
        }
    }

    public async Task ActivateUser(string xflowUserId)
    {
        var httpclient = _httpClientFactory.CreateClient(_namedHttpClientName);
        string activateUrl = $"/User/{xflowUserId}/Activate";

        _ = await httpclient.PutAsync(activateUrl, new DeliberatelyEmptyContent());
    }

Comments

1

To solve this problem, use this example:

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

Comments

0

You can send an empty object too:

var emptyObject = new object();
HttpResponseMessage httpResponse = await server.CreateClient().PutAsJsonAsync(Put.SomeUrl(), emptyObject);

Comments

-6

I think it does that automagically if your web method has no parameters or they all fit into URL template.

For example this declaration sends empty body:

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

3 Comments

I'm trying to SEND an empty body. The HttpClient.Post() method requires an URI and a HttpContent object. I'm not what to pass as the HttpContent when I don't want to send anything.
So you're not using WCF. That's even easier: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse)request.GetResponse(); ... you result in response
I'm using HttpClient, not HttpWebRequest. Using StringContent with an empty string worked.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.