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.