O que é "Resposta 406-Não Aceitável" em HTTP?

185

No meu aplicativo Ruby on Rails, tentei fazer upload de uma imagem através do cliente POSTMAN REST no formato Base64 . Quando POST a imagem, recebo uma resposta 406 não aceitável . Quando verifiquei meu banco de dados, a imagem estava lá e foi salva com sucesso.

Qual é o motivo desse erro, há algo que preciso especificar no meu cabeçalho?

Meu pedido:

URL --- http://localhost:3000/exercises.json

Cabeçalho:

Content-Type  -  application/json

Dados não tratados:

{
    "exercise": {
        "subbodypart_ids": [
            "1",
            "2"
        ],
        "name": "Exercise14"
    },
    "image_file_name": "Pressurebar Above.jpg",
    "image":"******base64 Format*******"
}
Cyber
fonte

Respostas:

263

Sua operação não falhou.

Seu serviço de back-end está dizendo que o tipo de resposta que está retornando não é fornecido no cabeçalho Aceitar HTTP na sua solicitação do Cliente.

Ref: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

  1. Descubra a resposta (tipo de conteúdo) retornada pelo Serviço.
  2. Forneça isso (tipo de conteúdo) em sua solicitação Aceitar cabeçalho.

http://en.wikipedia.org/wiki/HTTP_status_code -> 406

TheWhiteRabbit
fonte
6
Olá, Quando você diz "Descubra a resposta (tipo de conteúdo) retornada pelo serviço"? Como posso verificar isso? Estou retornando json de um arquivo php, então presumo que o tipo de conteúdo seja json (ou preciso especificar isso nos cabeçalhos do arquivo php?) Também forneci esse tipo de conteúdo no cabeçalho da minha solicitação, como 'Aceitar': 'application / json'. isso seria correto? obrigada
Sarah
41

406 Não aceitável O recurso identificado pela solicitação é capaz apenas de gerar entidades de resposta que possuem características de conteúdo não aceitáveis ​​de acordo com os cabeçalhos de aceitação enviados na solicitação.

406 acontece quando o servidor não pode responder com o cabeçalho de aceitação especificado na solicitação. No seu caso, parece que application / json para a resposta pode não ser aceitável para o servidor.

ashutosh raina
fonte
7
Você não remove o cabeçalho, precisará fornecer um cabeçalho diferente que seja aceitável para o servidor. en.wikipedia.org/wiki/…
ashutosh raina
7

Você mencionou que está usando o Ruby on Rails como back-end. Você não publicou o código para o método relevante, mas meu palpite é que ele se parece com isso:

def create
  post = Post.create params[:post]
  respond_to do |format|
    format.json { render :json => post }
  end
end

Altere para:

def create
  post = Post.create params[:post])
  render :json => post
end

E isso resolverá o seu problema. Funcionou para mim :)

itamaryu
fonte
2

Você também pode receber uma resposta 406 quando cookies inválidos são armazenados ou referenciados no navegador - por exemplo, ao executar um servidor Rails no modo Dev localmente.

Se você executou dois projetos diferentes na mesma porta, o navegador pode fazer referência a um cookie de uma sessão localhost diferente.

Isso aconteceu comigo ... me tropeçou por um minuto. Procurando no navegador> Modo de desenvolvedor> Rede mostrou.

etusm
fonte
2

"Às vezes", isso pode significar que o servidor teve um erro interno e queria responder com uma mensagem de erro (ex: 500 com carga JSON), mas como os cabeçalhos da solicitação não disseram que aceitavam JSON, ele retornava um 406. Vai saber. (neste caso: webapp de inicialização por mola).

Nesse caso, sua operação falhou. Mas a mensagem de falha foi obscurecida por outra.

rogerdpack
fonte
1

No meu caso, eu adicionei:

Content-Type: application/x-www-form-urlencoded

resolveu meu problema completamente.

Kadir Erturk
fonte
1
const request = require('request');

const headers = {
    'Accept': '*/*',
    'User-Agent': 'request',
};

const options = {
    url: "https://example.com/users/6",
    headers:  headers
};

request.get(options, (error, response, body) => {
    console.log(response.body);
});
JP Ventura
fonte
0

Se você estiver usando 'request.js', poderá usar o seguinte:

var options = {
  url: 'localhost',
  method: 'GET',
  headers:{
    Accept: '*/*'
  }
}

request(options, function (error, response, body) {
  ...
})
Alfredo Morales Pinzón
fonte
0

No meu caso para uma API no .NET-Core, a API está configurada para funcionar com XML (por padrão, é definida como resposta com JSON), portanto, adiciono esta anotação no meu Controller:

[Produces("application/xml")]
public class MyController : ControllerBase {...}

Obrigado por me colocar no caminho!

Francois Borgies
fonte