Making an async HttpClient post request with data from FormCollection
Asked Answered
U

1

22

I am doing an Asp.Net MVC 4 project and am looking to an internal request (like a proxy) to our api service.

This is what the index method looks like in my controller. I'm stuck at the PostAsync part.

[HttpPost]
public async Task<ActionResult> Index(FormCollection body){

   HttpClient httpClient  = new HttpClient();
   httpClient.BaseAddress = new Uri("http://myapi.com");

   // posts to http://myapi.com/users
   var response = await httpClient.PostAsync("users", body);

   if(response.isSuccessStatusCode) return Json(new {
        status = true,
        url    = response.Content.Url
   });
}

I want to pass my "application/x-form-urlencoded" "body" content to the PostAsync POST method. However, I get an error reading "body is not of type HttpContent".

I can't cast or convert. What now?

Let me know what I'm doing incorrectly here.

Erik

Untutored answered 23/10, 2012 at 18:31 Comment(2)
FormCollection and HttpContent are completely different types. Why would you expect that your code would work (with or without a cast)? What you need to do is to create a new HttpContent, based on the data in your FormCollection.Doronicum
Right, Im trying to illustrate what I need done above. I'm looking for more of a walk-through than a simple answer. @svick, do you have an examples of creating a new HttpContent based on a FormCollection set of data?Untutored
T
38

I'm not entirely sure what you're trying to do, but possibly converting the FormCollection to a dictionary and using the FormUrlEncodedContent class is what you're looking for.

e.g.:

var response = await httpClient.PostAsync("users",
                                          new FormUrlEncodedContent(
                                              body.
                                                  AllKeys.ToDictionary(
                                                      k => k, v => body[v])));
Trig answered 23/10, 2012 at 20:27 Comment(5)
All this time, I was trying to do this using MultipartFormDataContent and failing. Simply using FormUrlEncodedContent with my request works like a charm. Thanks!Bathtub
is it not better to convert the data to HttpContent? or is HttpContent just another dictionary?Untutored
@Untutored I think HttpContent is an abstract base class. You cannot instantiate that. Instead, u need a concrete class .. which inherits that .. and FormUrlEncodedContent i think is one of those :)Chromic
Yes, HttpContent is abstract, you need to use one of the concrete classes like ByteArrayContent, FormUrlEncodedContent, etc...Trig
@Untutored FormUrlEncodedContent is an HttpContent, see MSDN: msdn.microsoft.com/en-us/library/… public class FormUrlEncodedContent : ByteArrayContent and public class ByteArrayContent : HttpContentCanales

© 2022 - 2024 — McMap. All rights reserved.