Fehler beim Senden von json im POST an den Web-API-Dienst


90

Ich erstelle einen Webdienst mithilfe der Web-API. Ich habe eine einfache Klasse implementiert

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

Und dann habe ich in meinem Controller implementiert

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

Aber wenn ich die API aufrufe, die POST übergibt, wird die Datei json:

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

Ich erhalte die folgende Fehlermeldung:

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

Was mache ich falsch?


9
Sie müssen einen Header von "application / json" hinzufügen, damit die Nutzdaten vom Client akzeptiert werden.
Adam Zuckerman

Ich habe die Header in meiner HTTP-Anfrage korrekt eingestellt. Das Problem scheint jedoch serverseitig zu sein: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82

4
Es sieht so aus, als würden Sie nur den AcceptHeader auf setzen application/json. Sie müssen auch den Content-TypeHeader auf setzen application/json.
Brian Rogers

Antworten:


186

In der HTTP-Anforderung müssen Sie den Inhaltstyp auf Folgendes festlegen: Content-Type: application/json

Wenn Sie also einen Fiddler-Client verwenden, fügen Sie ihn Content-Type: application/jsondem Anforderungsheader hinzu


2
  1. Sie müssen die Header-Eigenschaft hinzufügen Content-Type:application/json
  2. Wenn Sie einen Eingabeparameter für die POST-Anforderungsmethode definieren, der mit folgenden Anmerkungen versehen werden soll [FromBody], z .

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
  3. Alle JSON-Eingabedaten müssen Rohdaten sein .


1

Ein weiterer Tipp ... wo Sie "content-type: application / json" ... zum Textfeld auf der Registerkarte "Composer / Parsed" hinzufügen können. Da dort bereits 3 Zeilen ausgefüllt sind, habe ich diesen Inhaltstyp als 4. Zeile hinzugefügt. Das hat die Post zum Laufen gebracht.


0

Bitte überprüfen Sie, ob Sie die Methode als POSTstattdessen als übergeben haben GET. In diesem Fall erhalten Sie den gleichen Fehler wie oben.

$http({               
 method: 'GET',

Der Medientyp 'text / plain' der Anforderungsentität wird für diese Ressource nicht unterstützt.


1
Die Frage bezieht sich speziell auf einen http-POST. Er fordert keine Daten von dem Server an, an den er Daten an den Server sendet.
Krieg

0

Ich hatte alle meine Einstellungen in der akzeptierten Antwort abgedeckt. Das Problem, das ich hatte, war, dass ich versuchte, den Entity Framework-Entitätstyp "Task" wie folgt zu aktualisieren:

public IHttpActionResult Post(Task task)

Was für mich funktioniert hat, war, meine eigene Entität "DTOTask" zu erstellen, wie:

public IHttpActionResult Post(DTOTask task)

0

Es erfordert enthalten Content-Type:application/jsonin Web - api Anfrage - Header - Abschnitt , wenn keine Inhalte dann durch Standard erwähnen , es ist Content-Type:text/plaingeht auf Anfrage.

Der beste Weg, um API auf Postman Tool zu testen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.