Search code examples
c#.net-5

Why does HttpClient.PostAsync appear to be sending the request as a GET rather than POST?


I've been trying to send a POST request using HttpClient without a body using the PostAsync method. However, to my utter bewildement, the request is getting sent as a GET and not a POST.

enter image description here

Naturally, the request fails with a 405 Method Not Allowed becase the server doesn't allow GET.

Code sample:

var response = await new HttpClient().PostAsync("https://api.creativecommons.engineering/v1/auth_tokens/token?client_id=adsf&client_secret=asdf&grant_type=client_credentials", null);
Console.WriteLine(response.RequestMessage);

Produces:

Method: GET, RequestUri: 'https://api.creativecommons.engineering/v1/auth_tokens/token/?client_id=adsf&client_secret=asdf&grant_type=client_credentials', Version: 1.1

Example in .NET Fiddle

I've also tried using Flurl, but lead to the same result (I am guessing it is using HttpClient under the hood).

Any ideas why PostAsync is sending the request as a GET rather than POST?


Update

This question got quite a bit of hate without offering an ounce of constructive criticism... Well done StackOverflow, really well done, so much for being more welcoming...

If you come across a similar issue, here are the three things to look for:

  1. HttpClient will automatically redirect if the response is 301 (Redirect). It won't return you 301 as a status code!
  2. As it does the redirect it changes the request from POST to GET. This is technically correct, because in order to preserve the method when redirecting the server needs to return 307 and not 301.
  3. Check the address in the code against the one in the RequestMessage. This may be obvious in some cases, but in my case, the redirect involved adding a single / not something easily visible in the debugger window!
https://api.creativecommons.engineering/v1/auth_tokens/token?client_id=adsf&client_secret=asdf&grant_type=client_credentials
https://api.creativecommons.engineering/v1/auth_tokens/token/?client_id=adsf&client_secret=asdf&grant_type=client_credentials
                                                            ^    

Solution

  • I posted null to that body, looks like it is throwing a 405 and returning some information to look into. I believe the display of "GET" is deceiving.

    EDIT: Ok, so to revise:

    First the post executes and receives a 301 from the server.

    Fiddler showing a POST with a 301 response

    Followed by a redirect to another endpoint (as a GET) with the result of 405. Thus, the net result of your request manifested as a GET with a 405. My mistake.

    enter image description here