¿Qué es "406-Respuesta no aceptable" en HTTP?

185

En mi aplicación Ruby on Rails intenté cargar una imagen a través del cliente POSTMAN REST en formato Base64 . Cuando PUBLICO la imagen obtengo una respuesta 406 no aceptable . Cuando revisé mi base de datos, la imagen estaba allí y se guardó con éxito.

¿Cuál es la razón de este error? ¿Hay algo que deba especificar en mi encabezado?

Mi petición:

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

Encabezamiento:

Content-Type  -  application/json

Datos sin procesar:

{
    "exercise": {
        "subbodypart_ids": [
            "1",
            "2"
        ],
        "name": "Exercise14"
    },
    "image_file_name": "Pressurebar Above.jpg",
    "image":"******base64 Format*******"
}
Cibernético
fuente

Respuestas:

263

Su operación no falló.

Su servicio de fondo dice que el tipo de respuesta que está devolviendo no se proporciona en el encabezado Aceptar HTTP en su solicitud de Cliente.

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

  1. Descubra la respuesta (tipo de contenido) devuelta por el Servicio.
  2. Proporcione esto (tipo de contenido) en su solicitud Aceptar encabezado.

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

TheWhiteRabbit
fuente
66
Hola, cuando dices "Averigua la respuesta (tipo de contenido) devuelta por el servicio"? ¿Cómo puedo verificar esto? Estoy devolviendo json de un archivo php, así que supongo que el tipo de contenido será json (¿o necesito especificar esto en los encabezados del archivo php?) También proporcioné este tipo de contenido en el encabezado de mi solicitud como 'Aceptar': 'application / json'. ¿Sería esto correcto? gracias
Sarah
41

406 No aceptable El recurso identificado por la solicitud solo es capaz de generar entidades de respuesta que tienen características de contenido no aceptables de acuerdo con los encabezados de aceptación enviados en la solicitud.

406 ocurre cuando el servidor no puede responder con el encabezado de aceptación especificado en la solicitud. En su caso, parece que application / json para la respuesta puede no ser aceptable para el servidor.

ashutosh raina
fuente
77
No tiene que eliminar el encabezado, deberá proporcionar uno diferente que sea aceptable para el servidor. en.wikipedia.org/wiki/…
ashutosh raina
7

Mencionaste que estás usando Ruby on Rails como backend. No publicó el código para el método relevante, pero supongo que se parece a esto:

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

Cámbielo a:

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

Y resolverá tu problema. Funcionó para mí :)

itamaryu
fuente
2

También puede recibir una respuesta 406 cuando se almacenan o se hace referencia a cookies no válidas en el navegador, por ejemplo, cuando se ejecuta un servidor Rails en modo Dev localmente.

Si ejecutó dos proyectos diferentes en el mismo puerto, el navegador podría hacer referencia a una cookie de una sesión localhost diferente.

Esto me ha pasado ... me hizo tropezar por un minuto. Buscando en el navegador> Modo desarrollador> Red lo mostró.

etusm
fuente
2

"A veces" esto puede significar que el servidor tenía un error interno y quería responder con un mensaje de error (por ejemplo, 500 con carga JSON), pero dado que los encabezados de la solicitud no decían que aceptaba JSON, en su lugar, devuelve un 406. Imagínate. (en este caso: spring boot webapp).

En cuyo caso, su operación falló. Pero el mensaje de fracaso fue oscurecido por otro.

rogerdpack
fuente
1

En mi caso, agregué:

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

Resuelto mi problema por completo.

Kadir Erturk
fuente
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
fuente
0

Si está usando 'request.js', puede usar lo siguiente:

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

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

En mi caso para una API en .NET-Core, la API está configurada para funcionar con XML (de manera predeterminada está configurada para responder con JSON), así que agrego esta anotación en mi controlador:

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

¡Gracias por ponerme en el camino!

Francois Borgies
fuente