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?
Accept
nagłówekapplication/json
. Musisz także ustawićContent-Type
nagłówek naapplication/json
.Odpowiedzi:
W żądaniu HTTP musisz ustawić Content-Type na:
Content-Type: application/json
Więc jeśli używasz klienta Fiddler, dodaj
Content-Type: application/json
do nagłówka żądaniaźródło
Content-Type:application/json
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); }
Wszelkie dane wejściowe JSON muszą być danymi surowymi .
źródło
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.
źródło
Sprawdź, czy przekazujesz metodę jako
POST
zamiast jakoGET
. jeśli tak, otrzymasz ten sam błąd, co w opublikowanym powyżej.$http({ method: 'GET',
źródło
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)
źródło
Wymaga umieszczenia
Content-Type:application/json
w sekcji nagłówka żądania interfejsu API sieci Web, gdy nie wspomina o żadnej treści, a następnie domyślnieContent-Type:text/plain
przechodzi do żądania.Najlepszy sposób na przetestowanie interfejsu API w narzędziu Listonosz.
źródło