Дополнительно
Как передать json POST-данные в метод Web API в виде объекта?
В приложении ASP.NET MVC4 Web API для сохранения клиента определен метод post. Клиент передается в формате json в теле запроса POST. Параметр Customer в post-методе содержит нулевые значения для свойств.
Как это исправить, чтобы опубликованные данные передавались в виде объекта customer?
Если возможно, следует использовать Content-Type: application/x-www-form-urlencoded, так как я не знаю, как изменить его в javascript-методе, который постит форму.
Контроллер:
public class CustomersController : ApiController {
public object Post([FromBody] Customer customer)
{
return Request.CreateResponse(HttpStatusCode.OK,
new
{
customer = customer
});
}
}
}
public class Customer
{
public string company_name { get; set; }
public string contact_name { get; set; }
}
Запрос:
POST http://localhost:52216/api/customers HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"contact_name":"sdfsd","company_name":"ssssd"}
292
9
EDIT : 31/10/2017
Этот же код/подход будет работать и в Asp.Net Core 2.0. Основное отличие заключается в том, что в asp.net core контроллеры web api и Mvc объединены в единую модель контроллера. Поэтому возвращаемый тип может быть
IActionResult
или одной из его реализаций (например,OkObjectResult
).Использовать
Для преобразования в строку JSON при отправке необходимо использовать метод
JSON.stringify
,А связка моделей привяжет json-данные к объекту вашего класса.
Приведенный ниже код будет работать нормально (проверено)
Результат
Свойство
contentType
сообщает серверу, что мы отправляем данные в формате JSON. Поскольку мы отправили структуру данных в формате JSON, привязка модели произойдет корректно.Если просмотреть заголовки ajax-запроса, то можно увидеть, что значение
Content-Type
установлено какapplication/json
.Если не указать contentType явно, то будет использован тип содержимого по умолчанию, а именно
application/x-www-form-urlencoded;
.Правка от ноября 2015 г. для решения других возможных проблем, поднятых в комментариях
Размещение сложного объекта
Допустим, у вас есть сложный класс модели представления в качестве параметра метода действия web api, например, так
а конечная точка web api имеет вид
На момент написания статьи ASP.NET MVC 6 является последней стабильной версией, и в MVC6 контроллеры Web api и контроллеры MVC наследуются от базового класса
Microsoft.AspNet.Mvc.Controller
.Для отправки данных в метод со стороны клиента должен работать следующий код
Привязка модели работает для некоторых свойств, но не для всех! Почему?
Если не украсить параметр метода web api атрибутом
[FromBody]
.и отправить модель (сырой javascript-объект, не в формате JSON) без указания значения свойства contentType
Привязка к модели будет работать для плоских свойств модели, а не для свойств, тип которых является сложным/другим типом. В нашем случае свойства
Id
иName
будут правильно привязаны к параметруm
, но свойствоTags
будет представлять собой пустой список.Такая же проблема возникнет и при использовании короткой версии,
$.post
, которая при отправке запроса будет использовать стандартный Content-Type.Работа с POST в webapi может быть сложной! Хотелось бы добавить к уже правильному ответу...
Сфокусируюсь именно на POST, так как работа с GET тривиальна. Не думаю, что многие будут искать решение проблемы с GET в webapis. В общем...
Если ваш вопрос заключается в том, как в MVC Web Api использовать пользовательские имена методов действий, а не общие HTTP-глаголы? - Выполнять несколько постов? - Опубликовать несколько простых типов? - Опубликовать сложные типы с помощью jQuery?
Тогда вам могут помочь следующие решения:
Во-первых, чтобы использовать Custom Action Methods в Web API, добавьте web api маршрут как:
А затем можно создать методы действия, например:
Теперь выполните следующий jQuery из консоли браузера
Во-вторых, для выполнения нескольких постов все просто: создайте несколько методов действия и украсьте их атрибутом [HttpPost]. Используйте [ActionName("MyAction")] для присвоения пользовательских имен и т.д. К jQuery мы перейдем в четвертом пункте ниже.
В-третьих, во-первых, размещение в одном действии нескольких СИМПЛИЧНЫХ типов невозможно. Более того, существует специальный формат для отправки даже одного простого типа (помимо передачи параметра в строке запроса или в стиле REST). Именно этот момент заставил меня биться головой с Rest-клиентами (такими как Fiddler и расширение Chrome'Advanced REST client) и охотиться в Интернете в течение почти 5 часов, когда, в конце концов, следующий URL оказался полезным. Я процитирую соответствующее содержание, так как ссылка может оказаться нерабочей!
PS: Заметили особенный синтаксис?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
В общем, оставим эту историю в прошлом. Идем дальше:
В-четвертых, постинг сложных типов с помощью jQuery, конечно же, оперативно задействует $.ajax():
Допустим, метод action принимает объект Person, у которого есть id и имя. Итак, из javascript:
А действие будет выглядеть следующим образом:
Все вышеперечисленное сработало у меня!!! Ура!
Я только что поиграл с этим и обнаружил довольно странный результат. Допустим, у вас есть публичные свойства класса на C#, например, такие:
тогда вы должны сделать трюк с JSON.stringify, как предложил Shyju, и вызвать его следующим образом:
Однако, если вы определите геттеры и сеттеры вашего класса следующим образом:
то вызвать его можно гораздо проще:
При этом используется HTTP-заголовок:
Я не совсем понимаю, что здесь происходит, но это похоже на ошибку (особенность?) фреймворка. Предположительно, разные методы связывания вызывают разные "адаптеры", и если адаптер для application/json работает с публичными свойствами, то адаптер для данных в кодировке формы - нет.
Однако я не представляю, какой из этих вариантов считается лучшим.
Используйте <б>в JSON.преобразовать в строки()</б> получить строку в формате JSON, убедитесь, что, делая AJAX-вызов вам пройти указанные ниже атрибуты:
Ниже даю код jQuery, чтобы сделать AJAX-вызов для веб asp.net API-интерфейс:
в
в
Убедитесь, что ваш сервис вызова WebAPI ждет строго типизированный объект со структурой, которая соответствует JSON, который вы проходите. И убедитесь, что вы преобразовать в строки в JSON, который вы публикуете.
Вот мой код JavaScript (используя AngluarJS):
И вот мой веб-API контроллера:
Следующий код, чтобы вернуть данные в формате JSON ,а не XML и веб-API 2 :-
Поместите следующую строку в мировой.файл asax
Microsoft дал хороший пример этого:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Первый проверить запрос
и чем использовать сериализованные данные.
Здесь 'статус' - это поле в сложный тип. Сериализация делается .Чистая, не нужно беспокоиться об этом.
1)в клиенте вы можете отправить вам http.POST-запрос в строку, как показано ниже
2)тогда в ваш контроллер веб-API вы можете десериализовать его
3)Ваш класс ApiReceivedListOfObjects должен быть как ниже
4)Убедитесь, что ваш сериализованную строку (здесь IndexInfo) становится ниже структуры перед JsonConvert.Команда DeserializeObject в шаге 2