Errore durante l'invio di json in POST al servizio API Web


90

Sto creando un servizio Web utilizzando l'API Web. Ho implementato una semplice classe

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

E poi l'ho implementato all'interno del mio controller

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

Ma quando chiamo l'API passando in POST il file json:

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

Ottengo il seguente messaggio di errore:

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

Che cosa sto facendo di sbagliato?


9
È necessario aggiungere un'intestazione di "application / json" affinché il payload venga accettato dal client.
Adam Zuckerman

Ho impostato correttamente le intestazioni nella mia richiesta HTTP. Tuttavia il problema sembra essere lato server: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82

4
Sembra che tu stia solo impostando l' Acceptintestazione su application/json. È inoltre necessario impostare l' Content-Typeintestazione su application/json.
Brian Rogers

Risposte:


186

Nella richiesta HTTP è necessario impostare Content-Type su: Content-Type: application/json

Quindi, se stai usando il client Fiddler, aggiungi Content-Type: application/jsonall'intestazione della richiesta


2
  1. Devi aggiungere la proprietà dell'intestazione Content-Type:application/json
  2. Quando si definisce un parametro di input del metodo di richiesta POST che deve essere annotato come [FromBody], ad esempio :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
  3. Tutti i dati di input JSON devono essere dati grezzi .


1

un altro suggerimento ... dove aggiungere "content-type: application / json" ... al campo della casella di testo nella scheda Compositore / Parsed. Ci sono 3 righe già compilate, quindi ho aggiunto questo tipo di contenuto come quarta riga. Questo ha fatto funzionare il Post.


0

Per favore controlla se stai passando il metodo come POSTinvece di GET. in tal caso riceverai lo stesso errore di un messaggio che hai postato sopra.

$http({               
 method: 'GET',

Il tipo di supporto dell'entità richiesta "text / plain" non è supportato per questa risorsa.


1
La domanda riguarda specificamente un POST http, non sta richiedendo dati dal server che sta inviando dati al server.
Guerra

0

Avevo coperto tutte le mie impostazioni nella risposta accettata. Il problema che ho avuto è stato che stavo cercando di aggiornare il tipo di entità Entity Framework "Attività" come:

public IHttpActionResult Post(Task task)

Quello che ha funzionato per me è stato creare la mia entità "DTOTask" come:

public IHttpActionResult Post(DTOTask task)

0

È necessario includere Content-Type:application/jsonnella sezione dell'intestazione della richiesta API Web quando non si menziona alcun contenuto, quindi per impostazione predefinita viene Content-Type:text/plainpassato alla richiesta.

Il modo migliore per testare l'API sullo strumento postino.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.