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?

GVillani82
quelle
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

Beaumondo
quelle
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 .

Kiran Sagvekar
quelle
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.

John Santora
quelle
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.

Sudheer Kondala
quelle
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)
Michael Washington
quelle
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.

Kiran Sagvekar
quelle