Опубликовать JSON HttpContent для веб-API ASP.NET
У меня есть веб-API ASP.NET, и я могу получить доступ к HTTP-запросам просто отлично, теперь мне нужно передать пару параметров в запрос PostAsync следующим образом:
var param = Newtonsoft.Json.JsonConvert.SerializeObject(new { id=_id, code = _code });
HttpContent contentPost = new StringContent(param, Encoding.UTF8, "application/json");
var response = client.PostAsync(string.Format("api/inventory/getinventorybylocationidandcode"), contentPost).Result;
Этот вызов возвращает результат 404 Not Found.
Действия API на стороне сервера выглядят так:
[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode(int id, string code) {
...
}
И только для подтверждения моего маршрута в веб-API выглядит так:
config.Routes.MapHttpRoute(
name: "DefaultApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Я предполагаю, что неправильно передаю JSON HttpContent, почему бы это вернуть статус 404?
Ответы
Ответ 1
Причина, по которой вы получаете 404, заключается в том, что фреймворк не нашел способ выполнить данный запрос. По умолчанию Web API использует следующие правила для привязки параметров в методах:
- Если параметр является "простым" типом, Web API пытается получить значение из URI. Простые типы включают в себя примитивные типы .NET(int, bool, double и т.д.), А также TimeSpan, DateTime, Guid, decimal и string, а также любой тип с конвертером типов, который может конвертировать из строки. (Подробнее о преобразователях типов позже.)
- Для сложных типов Web API пытается прочитать значение из тела сообщения, используя формат медиа-типа.
Учитывая эти правила, если вы хотите связать этот параметр с телом POST, просто добавьте атрибут [FromBody]
перед типом:
[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode([FromBody] int id, string code) {
...
}
Для получения дополнительной информации см. документацию.