Search code examples
c#asp.net-mvchttp-headershttpwebrequesthttp-get

HttpWebRequest GET with object as parameter


I'm trying to call an API from a Windows Service. The API is written in ASP MVC. So far, I am creating requests something like this:

private List<T> GetCollectionFromApi<T>(string url)
    {
        List<T> result = new List<T>();

        try
        {
            var request = (HttpWebRequest) WebRequest.Create(url);
            request.Method = "GET";

            using (var response = (HttpWebResponse) request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(stream))
                    {
                        result.AddRange(JsonConvert.DeserializeObject<List<T>>(sr.ReadToEnd()));
                    }
                }
            }
        }
        catch (Exception e)
        {
            // handle err
        }

        return result;
    }

This is all fine, but now I need to pass a parameter with my GET request. That parameter is an object, not a primitive type.

Do I deconstruct it, property by property, in a query string? Or do I add it to request header somehow? I do plan on relying on DefaultModelBinder in API's controller. Any plan would be appreciated.


Solution

  • API Side:

    You need to use [FromUri] attribute in your API action.

    For more information about parameter binding please review this link.

    public class SomeData
    {
        public int Start { get; set; } 
        public int End { get; set; }
    }
    public SomeController : ApiController
    {
        public HttpResponseMessage Get([FromUri] SomeData data) { ... }
    }
    

    Client Side

    You need send your parameters in query as usual.

    http://localhost/api/Some?Start=0&End=10
    

    Also one more interesting link for details is here.