Che cos'è la "risposta non accettabile 406" in HTTP?


185

Nella mia applicazione Ruby on Rails ho provato a caricare un'immagine tramite il client POSTMAN REST in formato Base64 . Quando invio l'immagine sto ricevendo una risposta non accettabile 406 . Quando ho controllato il mio database, l'immagine era lì ed è stata salvata con successo.

Qual è la ragione di questo errore, c'è qualcosa che devo specificare nella mia intestazione?

La mia richiesta:

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

Intestazione:

Content-Type  -  application/json

Dati non elaborati:

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

Risposte:


263

La tua operazione non è fallita.

Il servizio di back-end afferma che il tipo di risposta che sta restituendo non viene fornito nell'intestazione Accept HTTP nella richiesta del client.

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

  1. Scopri la risposta (tipo di contenuto) restituita dal servizio.
  2. Fornire questo (tipo di contenuto) nell'intestazione Accetta richiesta.

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


6
Ciao, quando dici "Scopri la risposta (tipo di contenuto) restituita dal servizio"? Come posso controllare questo? Sto restituendo json da un file php, quindi suppongo che il tipo di contenuto sarà json (o devo specificarlo nelle intestazioni del file php?) Inoltre ho fornito questo tipo di contenuto nell'intestazione della mia richiesta in questo modo 'Accetta': 'application / json'. sarebbe corretto? grazie
Sarah

41

406 Non accettabile La risorsa identificata dalla richiesta è in grado di generare entità di risposta che presentano caratteristiche di contenuto non accettabili in base alle intestazioni di accettazione inviate nella richiesta.

406 si verifica quando il server non è in grado di rispondere con l'intestazione accetta specificato nella richiesta. Nel tuo caso sembra application / json per la risposta potrebbe non essere accettabile per il server.


7
Non devi rimuovere l'intestazione, dovrai fornirne una diversa accettabile per il server. en.wikipedia.org/wiki/…
ashutosh raina,

7

Hai detto che stai usando Ruby on Rails come backend. Non hai pubblicato il codice per il metodo pertinente, ma la mia ipotesi è che assomigli a questo:

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

Modificalo in:

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

E risolverà il tuo problema. Ha funzionato per me :)


2

Puoi anche ricevere una risposta 406 quando i cookie non validi vengono archiviati o referenziati nel browser, ad esempio quando si esegue localmente un server Rails in modalità Dev.

Se ti è capitato di eseguire due progetti diversi sulla stessa porta, il browser potrebbe fare riferimento a un cookie di una sessione localhost diversa.

Questo mi è successo ... mi ha fatto inciampare per un minuto. Guardando nel browser> Modalità sviluppatore> Rete lo ha mostrato.


2

"A volte" questo può significare che il server ha avuto un errore interno e ha voluto rispondere con un messaggio di errore (es: 500 con payload JSON) ma poiché le intestazioni della richiesta non hanno detto che ha accettato JSON, restituisce invece un 406. Vai a capire. (in questo caso: springapp webapp).

In tal caso, l'operazione non è riuscita. Ma il messaggio di fallimento è stato oscurato da un altro.


1

Nel mio caso, ho aggiunto:

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

risolto completamente il mio problema.


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);
});

0

Se stai usando 'request.js' potresti usare quanto segue:

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

request(options, function (error, response, body) {
  ...
})

0

Nel mio caso per un'API in .NET-Core, l'API è impostato per funzionare con XML (per impostazione predefinita è impostato per rispondere con JSON), quindi aggiungo questa annotazione nel mio controller:

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

Grazie per avermi messo sulla strada!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.