15

i'm making a request do a asp.net webapi Post Method, and i'm not beeing able to get a request variable.

Request

jQuery.ajax({ url: sURL, type: 'POST', data: {var1:"mytext"}, async: false, dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=UTF-8' })
    .done(function (data) {
        ...
    });

WEB API Fnx

    [AcceptVerbs("POST")]
    [ActionName("myActionName")]
    public void DoSomeStuff([FromBody]dynamic value)
    {
        //first way
        var x = value.var1;

        //Second way
        var y = Request("var1");

    }

i Cannot obtain the var1 content in both ways... (unless i create a class for that)

how should i do that?

5 Answers 5

24

First way:

    public void Post([FromBody]dynamic value)
    {
        var x = value.var1.Value; // JToken
    }

Note that value.Property actually returns a JToken instance so to get it's value you need to call value.Property.Value.

Second way:

    public async Task Post()
    {        
        dynamic obj = await Request.Content.ReadAsAsync<JObject>();
        var y = obj.var1;
    }

Both of the above work using Fiddler. If the first option isn't working for you, try setting the content type to application/json to ensure that the JsonMediaTypeFormatter is used to deserialize the content.

Sign up to request clarification or add additional context in comments.

1 Comment

and if you want to do this in a helper method, and don't totally understand the await syntax, you can use Request.Content.ReadAsAsync<JObject>().Result["var1"] (see full answer)
7

After banging my head around for a while on this and trying many different things I ended up putting some breakpoints on the API server and found the key value pairs stuffed down in the request. After I knew where they were, it was easy to access them. However, I have only found this method to work with WebClient.UploadString. However, it does work easily enough and allows you to load up as many parameters as you like and very easily access them server side. Note that I am targeting .net 4.5.

CLIENT SIDE

// Client request to POST the parameters and capture the response
public string webClientPostQuery(string user, string pass, string controller)
{
    string response = "";

    string parameters = "u=" + user + "&p=" + pass; // Add all parameters here.
    // POST parameters could also easily be passed as a string through the method.

    Uri uri = new Uri("http://localhost:50000/api/" + controller); 
    // This was written to work for many authorized controllers.

    using (WebClient wc = new WebClient())
    {
        try
        {
            wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            response = wc.UploadString(uri, login);
        }
        catch (WebException myexp)
        { 
           // Do something with this exception.
           // I wrote a specific error handler that runs on the response elsewhere so,
           // I just swallow it, not best practice, but I didn't think of a better way
        }
    }

    return response;
}

SERVER SIDE

// In the Controller method which handles the POST request, call this helper:
string someKeyValue = getFormKeyValue("someKey");
// This value can now be used anywhere in the Controller.
// Do note that it could be blank or whitespace.

// This method just gets the first value that matches the key.
// Most key's you are sending only have one value. This checks that assumption.
// More logic could be added to deal with multiple values easily enough.
public string getFormKeyValue(string key)
{
    string[] values;
    string value = "";
    try
    {
        values = HttpContext.Current.Request.Form.GetValues(key);
        if (values.Length >= 1)
            value = values[0];
    }
    catch (Exception exp) { /* do something with this */ }

    return value;
}

For more info on how to handle multi-value Request.Form Key/Value pairs, see:

http://msdn.microsoft.com/en-us/library/6c3yckfw(v=vs.110).aspx

Comments

2

I searched all morning to find an answer that depicted both client and server code, then finally figured it out.

Brief intro - The UI is an MVC 4.5 project that implements a standard view. The server side is an MVC 4.5 WebApi. The objective was to POST the model as JSON and subsequently update a database. It was my responsibility to code both the UI and backend. Below is the code. This worked for me.

Model

public class Team
{
    public int Ident { get; set; }
    public string Tricode { get; set; }
    public string TeamName { get; set; }
    public string DisplayName { get; set; }
    public string Division { get; set; }
    public string LogoPath { get; set; }
}

Client Side (UI Controller)

    private string UpdateTeam(Team team)
    {
        dynamic json = JsonConvert.SerializeObject(team);
        string uri = @"http://localhost/MyWebApi/api/PlayerChart/PostUpdateTeam";

        try
        {
            WebRequest request = WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentType = "application/json; charset=utf-8";
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
            }
            WebResponse response = (HttpWebResponse)request.GetResponse();
            using (var streamReader = new StreamReader(response.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
            }
        }
        catch (Exception e)
        {
            msg = e.Message;
        }
    }

Server Side (WebApi Controller)

    [Route("api/PlayerChart/PostUpdateTeam")]
    [HttpPost]
    public string PostUpdateTeam(HttpRequestMessage context)
    {
        var contentResult = context.Content.ReadAsStringAsync();
        string result = contentResult.Result;
        Team team = JsonConvert.DeserializeObject<Team>(result);

        //(proceed and update database)
    }

WebApiConfig (route)

        config.Routes.MapHttpRoute(
            name: "PostUpdateTeam",
            routeTemplate: "api/PlayerChart/PostUpdateTeam/{context}",
            defaults: new { context = RouteParameter.Optional }
        );

Comments

0

Try this.

public string Post(FormDataCollection form) { 
    string par1 = form.Get("par1");

    // ...
}

Comments

-5

try using following way

[AcceptVerbs("POST")]
[ActionName("myActionName")]
public static void DoSomeStuff(var value)
{
    //first way
   var x = value;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.