Помилка надсилання 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)"
}

Що я роблю не так?


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

Отже, якщо ви використовуєте клієнт fiddler, додайте Content-Type: application/jsonдо заголовка запиту


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 рядки, тому я додав цей тип вмісту як 4-й рядок. Це змусило Пошту працювати.


0

Будь ласка, перевірте, чи передаєте ви метод як POSTзамість GET. у такому випадку ви отримаєте таку ж помилку, як і раніше.

$http({               
 method: 'GET',

Тип медіа об’єкта запиту „text / plain” не підтримується для цього ресурсу.


1
Питання конкретно про http POST, він не вимагає дані від сервера, а надсилає дані на сервер.
Війна

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 на інструменті листоноші.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.