2013-05-14 4 views
3

Я создаю свой первый WebAPI с помощью ASP.NET MVC 4 WebAPI.Приложение ContentType/json в ASP.NET WebAPI

Запросы должны быть отправлены с использованием приложения/json ContentType с utf-8 в качестве набора символов.

Мой метод POST выглядит следующим образом:

public HttpResponseMessage Post([FromBody]string value) 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

Всякий раз, когда я посылаю запрос POST параметр «значение» равно нулю. Тело запроса содержит Json: { "name":"test" }.

Я предпочитаю, чтобы параметр метода Post был либо строкой, содержащей Json, либо быть типа JObject (из библиотеки JSON.NET). Как это сделать? И возможно ли это?

+1

Конечно. Прежде всего, переименуйте значение в 'name' – AFD

+0

Это не работает. Значение параметра по-прежнему равно нулю. В конце концов, Json будет похож на {"name1": [{}, {}], "name2": [], "name3": "some value"}. Я не хочу, чтобы Json был десериализован в объект самой системой. Я хочу сделать это сам. – Grant

+0

Если вы хотите контролировать десериализацию, добавьте форматирование типа пользовательских носителей для JSON. В противном случае, это вариант для отправки тела как строки x-www-form-urlencoded вместо этого, а затем для создания объекта из этого? –

ответ

2

Самый простой способ, чтобы захватить необработанный строку непосредственно из Request.Content:

public async Task<HttpResponseMessage> Post() 
{ 
    string value = await Request.Content.ReadAsStringAsync(); 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

Существует способ сделать ASP.NET Web Api лечить тело запроса как содержимое строки, но для того, чтобы сделать что содержание должно быть в формате =value, в вашем случае что-то вроде этого:

={ "name":"test" } 

Вы можете добиться чего-то вроде этого со следующими JQuery код (например):

$.post('api/values', '=' + JSON.stringify({ name: 'test' })); 

В этом случае вы можете использовать подпись с вашего вопроса.

В конце концов, вы всегда можете создать свой собственный MediaTypeFormatter, чтобы заменить значение по умолчанию JsonMediaTypeFormatter и сделать его всегда десериализацией содержимого в JObject. Вы можете узнать больше о создании и регистрации MediaTypeFormatterhere и here.

+0

Да, это работает! Спасибо! – Grant