Error al enviar json en POST al servicio API web

90

Estoy creando un servicio web usando API web. Implementé una clase simple

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

Y luego lo he implementado dentro de mi controlador

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

Pero cuando llamo a la API pasando POST el archivo json:

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

Recibo el siguiente mensaje de error:

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

¿Qué estoy haciendo mal?

GVillani82
fuente
9
Debe agregar un encabezado de "application / json" para que la carga útil sea aceptada por el cliente.
Adam Zuckerman
He configurado correctamente los encabezados en mi solicitud HTTP. Sin embargo, el problema parece estar en el lado del servidor: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82
4
Parece que solo está configurando el Acceptencabezado en application/json. También necesita establecer el Content-Typeencabezado en application/json.
Brian Rogers

Respuestas:

186

En la solicitud HTTP, debe establecer Content-Type en: Content-Type: application/json

Entonces, si está utilizando el cliente Fiddler, agregue Content-Type: application/jsonal encabezado de la solicitud

beaumondo
fuente
2
  1. Tienes que agregar la propiedad del encabezado Content-Type:application/json
  2. Cuando define cualquier parámetro de entrada de método de solicitud POST que debe anotarse como [FromBody], por ejemplo :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
    
  3. Todos los datos de entrada JSON deben ser datos sin procesar .

Kiran Sagvekar
fuente
1

otro consejo ... dónde agregar "content-type: application / json" ... al campo de cuadro de texto en la pestaña Composer / Parsed. Ya hay 3 líneas completadas allí, así que agregué este tipo de contenido como la cuarta línea. Eso hizo que el Post funcionara.

juan santora
fuente
0

Verifique si estaba pasando el método como en su POSTlugar como GET. si es así, obtendrá el mismo error que publicó anteriormente.

$http({               
 method: 'GET',

El tipo de medio de la entidad de solicitud 'text / plain' no es compatible con este recurso.

sudheer kondala
fuente
1
La pregunta es específicamente sobre un http POST, no está solicitando datos del servidor que está enviando datos al servidor.
Guerra
0

Tenía todas mis configuraciones cubiertas en la respuesta aceptada. El problema que tuve fue que estaba tratando de actualizar el tipo de entidad de Entity Framework "Tarea" como:

public IHttpActionResult Post(Task task)

Lo que funcionó para mí fue crear mi propia entidad "DTOTask" como:

public IHttpActionResult Post(DTOTask task)
Michael Washington
fuente
0

Requiere incluir Content-Type:application/jsonen la sección de encabezado de solicitud de la API web cuando no se menciona ningún contenido, luego, de forma predeterminada, se Content-Type:text/plainpasa a la solicitud.

La mejor manera de probar la API en la herramienta Postman.

Kiran Sagvekar
fuente