Błąd podczas wysyłania pliku json w POST do usługi internetowego interfejsu API

90

Tworzę usługę internetową przy użyciu interfejsu API sieci Web. Zaimplementowałem prostą klasę

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

A potem zaimplementowałem wewnątrz mojego kontrolera

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

Ale kiedy wywołuję API, przekazując w POST plik json:

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

Otrzymuję następujący komunikat o błędzie:

{
    "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)"
}

Co ja robię źle?

GVillani82
źródło
9
Musisz dodać nagłówek „application / json”, aby ładunek został zaakceptowany od klienta.
Adam Zuckerman
Poprawnie ustawiłem nagłówki w moim żądaniu HTTP. Wydaje się jednak, że problem leży po stronie serwera: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82
4
Wygląda na to, że ustawiasz tylko Acceptnagłówek application/json. Musisz także ustawić Content-Typenagłówek na application/json.
Brian Rogers

Odpowiedzi:

186

W żądaniu HTTP musisz ustawić Content-Type na: Content-Type: application/json

Więc jeśli używasz klienta Fiddler, dodaj Content-Type: application/jsondo nagłówka żądania

beaumondo
źródło
2
  1. Musisz dodać właściwość nagłówka Content-Type:application/json
  2. Podczas definiowania każdy parametr wejściowy metody żądania POST, które powinny być uwagami jak [FromBody], na przykład :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
    
  3. Wszelkie dane wejściowe JSON muszą być danymi surowymi .

Kiran Sagvekar
źródło
1

kolejna wskazówka ... gdzie dodać „content-type: application / json”… do pola tekstowego na karcie Kompozytor / Analizowany. Są tam już wypełnione 3 linie, więc dodałem ten typ zawartości jako czwartą linię. To sprawiło, że Post działa.

john santora
źródło
0

Sprawdź, czy przekazujesz metodę jako POSTzamiast jako GET. jeśli tak, otrzymasz ten sam błąd, co w opublikowanym powyżej.

$http({               
 method: 'GET',

Typ mediów jednostki żądania „tekst / zwykły” nie jest obsługiwany dla tego zasobu.

sudheer kondala
źródło
1
Pytanie dotyczy w szczególności http POST, nie żąda danych z serwera, ale wysyła dane do serwera.
Wojna
0

W zaakceptowanej odpowiedzi uwzględniono wszystkie moje ustawienia. Problem polegał na tym, że próbowałem zaktualizować typ jednostki Entity Framework „Zadanie”, na przykład:

public IHttpActionResult Post(Task task)

Udało mi się stworzyć własną jednostkę „DTOTask”, taką jak:

public IHttpActionResult Post(DTOTask task)
Michael Washington
źródło
0

Wymaga umieszczenia Content-Type:application/jsonw sekcji nagłówka żądania interfejsu API sieci Web, gdy nie wspomina o żadnej treści, a następnie domyślnie Content-Type:text/plainprzechodzi do żądania.

Najlepszy sposób na przetestowanie interfejsu API w narzędziu Listonosz.

Kiran Sagvekar
źródło