Подтвердить что ты не робот

Как получить значения Json Post с помощью asp.net webapi

Я делаю запрос, используя метод POST asp.net webapi, и я не могу получить переменную запроса.

Запрос

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 Не удается получить содержимое var1 в обоих направлениях... (если я не создаю для этого класс)

как мне это сделать?

4b9b3361

Ответ 1

Первый способ:

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

Обратите внимание, что value.Property фактически возвращает экземпляр JToken, поэтому, чтобы получить его значение, вам нужно вызвать value.Property.Value.

Второй способ:

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

Оба вышеупомянутых работы используют Fiddler. Если первый вариант не работает для вас, попробуйте настроить тип контента на application/json, чтобы убедиться, что JsonMediaTypeFormatter используется для десериализации содержимого.

Ответ 2

После того, как я несколько раз наткнулся на это и пробовал много разных вещей, я закончил тем, что поставил некоторые точки останова на сервере API и нашел пары значений ключа, заполненные в запросе. После того, как я знал, где они находятся, с ними было легко получить доступ. Тем не менее, я нашел этот метод только для работы с WebClient.UploadString. Однако он работает достаточно легко и позволяет загружать столько параметров, сколько вам нравится, и очень легко получить к ним доступ на стороне сервера. Обратите внимание, что я нацеливаюсь на .net 4.5.

КЛИЕНТСКАЯ СТОРОНА

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

СЕРВЕРНАЯ СТОРОНА

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

Для получения дополнительной информации о том, как обрабатывать многозначные пары ключ/значение Request.Form, см.

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

Ответ 3

Попробуйте это.

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

    // ...
}

Ответ 4

попробуйте использовать следующий путь

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