Erro ao enviar json em POST para serviço de API da web

90

Estou criando um serviço web usando Web API. Eu implementei uma aula simples

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

E então eu implementei dentro do meu controlador

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

Mas quando chamo a API passando em POST o arquivo json:

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

Recebo a seguinte mensagem de erro:

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

O que estou fazendo de errado?

GVillani82
fonte
9
Você deve adicionar um cabeçalho de "application / json" para que a carga útil seja aceita pelo cliente.
Adam Zuckerman
Eu configurei corretamente os cabeçalhos em minha solicitação HTTP. No entanto, o problema parece ser do lado do servidor: dropbox.com/s/xlidnnybs8v6d0u/Cattura.JPG
GVillani82
4
Parece que você está configurando apenas o Acceptcabeçalho para application/json. Você também precisa definir o Content-Typecabeçalho como application/json.
Brian Rogers

Respostas:

186

Na solicitação HTTP, você precisa definir o Content-Type para: Content-Type: application/json

Então, se você estiver usando o cliente Fiddler, adicione Content-Type: application/jsonao cabeçalho da solicitação

beaumondo
fonte
2
  1. Você deve adicionar propriedade de cabeçalho Content-Type:application/json
  2. Quando você define qualquer parâmetro de entrada do método de solicitação POST que deve ser anotado como [FromBody], por exemplo :

    [HttpPost]
    public HttpResponseMessage Post([FromBody]ActivityResult ar)
    {
      return new HttpResponseMessage(HttpStatusCode.OK);
    }
  3. Todos os dados de entrada JSON devem ser dados brutos .

Kiran Sagvekar
fonte
1

outra dica ... onde adicionar "content-type: application / json" ... ao campo de caixa de texto na guia Composer / Parsed. Existem 3 linhas já preenchidas lá, então adicionei este tipo de conteúdo como a 4ª linha. Isso fez o Post funcionar.

john santora
fonte
0

Verifique se você está passando o método como em POSTvez de GET. em caso afirmativo, você obterá o mesmo erro que postou acima.

$http({               
 method: 'GET',

O tipo de mídia da entidade de solicitação 'texto / simples' não é compatível com este recurso.

Sudheer Kondala
fonte
1
A questão é especificamente sobre um POST http, ele não está solicitando dados do servidor e está enviando dados para o servidor.
Guerra
0

Todas as minhas configurações foram incluídas na resposta aceita. O problema que tive é que estava tentando atualizar o tipo de entidade "Tarefa" do Entity Framework como:

public IHttpActionResult Post(Task task)

O que funcionou para mim foi criar minha própria entidade "DTOTask" como:

public IHttpActionResult Post(DTOTask task)
Michael Washington
fonte
0

É necessário incluir Content-Type:application/jsonna seção de cabeçalho de solicitação de API da Web quando não menciona nenhum conteúdo, então, por padrão, é Content-Type:text/plainpassado para solicitação.

Melhor maneira de testar a API na ferramenta Postman.

Kiran Sagvekar
fonte