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?


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


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 .


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.


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.


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)

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.