Ошибка отправки json в POST в службу веб-API

90

Я создаю веб-службу с помощью веб-API. Я реализовал простой класс

public class ActivityResult
{
    public String code;
    public int indexValue;
    public int primaryCodeReference;
}

А затем я реализовал внутри своего контроллера

[HttpPost]
public HttpResponseMessage Post(ActivityResult ar)
{
    return new HttpResponseMessage(HttpStatusCode.OK);
}

Но когда я вызываю API, передавая в POST файл json:

{"code":"XXX-542","indexValue":"3","primaryCodeReference":"7"}

Я получаю следующее сообщение об ошибке:

{
    "Message": "The request entity's media type 'text/plain' is not supported for this resource.",
    "ExceptionMessage": "No MediaTypeFormatter is available to read an object of type 'ActivityResult' from content with media type 'text/plain'.",
    "ExceptionType": "System.Net.Http.UnsupportedMediaTypeException",
    "StackTrace": "   in System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   in System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n   in System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"
}

Что я делаю не так?

GVillani82
источник
9
Вы должны добавить заголовок «application / json», чтобы полезная нагрузка принималась от клиента.
Адам Цукерман
Я правильно установил заголовки в своем HTTP-запросе. Однако проблема, похоже, на стороне сервера: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82
4
Похоже, вы устанавливаете только Acceptзаголовок application/json. Вам также необходимо установить Content-Typeзаголовок application/json.
Брайан Роджерс

Ответы:

186

В HTTP-запросе вам необходимо установить Content-Type на: Content-Type: application/json

Итак, если вы используете клиент-скрипач, добавьте Content-Type: application/jsonв заголовок запроса

Beaumondo
источник
2
  1. Вы должны добавить свойство заголовка Content-Type:application/json
  2. Когда вы определяете любой входной параметр метода запроса POST, который должен быть аннотирован [FromBody], например :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
    
  3. Любые входные данные JSON должны быть необработанными .

Киран Сагвекар
источник
1

еще один совет ... где добавить "content-type: application / json" ... в поле текстового поля на вкладке Composer / Parsed. Там уже заполнены 3 строки, поэтому я добавил этот Content-type как 4-ю строку. Это заставило Почту работать.

Джон Сантора
источник
0

Пожалуйста, проверьте, передаете ли вы метод POSTвместо as GET. в этом случае вы получите ту же ошибку, что и выше.

$http({               
 method: 'GET',

Тип мультимедиа объекта запроса «текст / простой» не поддерживается для этого ресурса.

Судхир Кондала
источник
1
Вопрос конкретно о http POST, он не запрашивает данные с сервера, он отправляет данные на сервер.
War
0

Все мои настройки были описаны в принятом ответе. Проблема заключалась в том, что я пытался обновить тип сущности Entity Framework «Задача», например:

public IHttpActionResult Post(Task task)

Для меня сработало создание моей собственной сущности "DTOTask", например:

public IHttpActionResult Post(DTOTask task)
Майкл Вашингтон
источник
0

Он требует включения Content-Type:application/jsonв раздел заголовка запроса веб-API, когда не упоминается какой-либо контент, тогда по умолчанию он Content-Type:text/plainпередается запросу.

Лучший способ проверить api на инструменте почтальона.

Киран Сагвекар
источник