Qu'est-ce que «406-Not Acceptable Response» dans HTTP?

185

Dans mon application Ruby on Rails, j'ai essayé de télécharger une image via le client POSTMAN REST au format Base64 . Lorsque JE POSTE l'image, j'obtiens une réponse 406 Not Acceptable . Lorsque j'ai vérifié ma base de données, l'image était là et a été enregistrée avec succès.

Quelle est la raison de cette erreur, dois-je spécifier quelque chose dans mon en-tête?

Ma demande:

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

Entête:

Content-Type  -  application/json

Données brutes:

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

Réponses:

263

Votre opération n'a pas échoué.

Votre service backend indique que le type de réponse qu'il renvoie n'est pas fourni dans l' acceptation en-tête HTTP de votre demande Client.

Réf: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

  1. Découvrez la réponse (type de contenu) renvoyée par Service.
  2. Indiquez ce (type de contenu) dans votre demande d'en-tête Accept.

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

TheWhiteRabbit
la source
6
Salut, Quand vous dites "Découvrez la réponse (type de contenu) renvoyée par le service"? Comment pourrais-je vérifier cela? Je retourne json à partir d'un fichier php, donc je présume que le type de contenu sera json (ou dois-je le spécifier dans les en-têtes du fichier php?) J'ai également fourni ce type de contenu dans mon en-tête de demande comme si `` Accepter '': 'application / json'. serait-ce correct? merci
Sarah
41

406 Non acceptable La ressource identifiée par la demande est uniquement capable de générer des entités de réponse dont les caractéristiques de contenu ne sont pas acceptables selon les en-têtes d'acceptation envoyés dans la demande.

406 se produit lorsque le serveur ne peut pas répondre avec l'en-tête d'acceptation spécifié dans la demande. Dans votre cas, il semble que l'application / json pour la réponse ne soit pas acceptable pour le serveur.

ashutosh raina
la source
7
Vous n'avez pas supprimé l'en-tête, vous devrez en fournir un autre qui soit acceptable pour le serveur. en.wikipedia.org/wiki/…
ashutosh raina
7

Vous avez mentionné que vous utilisiez Ruby on Rails comme backend. Vous n'avez pas publié le code de la méthode pertinente, mais je suppose que cela ressemble à ceci:

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

Changez-le en:

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

Et cela résoudra votre problème. Cela a fonctionné pour moi :)

Itamaryu
la source
2

Vous pouvez également recevoir une réponse 406 lorsque des cookies non valides sont stockés ou référencés dans le navigateur - par exemple, lors de l'exécution locale d'un serveur Rails en mode Dev.

Si vous exécutez deux projets différents sur le même port, le navigateur peut référencer un cookie d'une session d'hôte local différente.

Cela m'est arrivé ... m'a fait trébucher pendant une minute. La recherche dans le navigateur> Mode développeur> Réseau l'a montré.

etusm
la source
2

"Parfois", cela peut signifier que le serveur a eu une erreur interne et a voulu répondre avec un message d'erreur (ex: 500 avec la charge utile JSON), mais comme les en-têtes de la requête n'indiquaient pas qu'il acceptait JSON, il renvoie un 406 à la place. Allez comprendre. (dans ce cas: spring boot webapp).

Dans ce cas, votre opération a échoué. Mais le message d'échec a été obscurci par un autre.

rogerdpack
la source
1

Dans mon cas, j'ai ajouté:

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

résolu mon problème complètement.

Kadir Erturk
la source
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
la source
0

Si vous utilisez 'request.js', vous pouvez utiliser ce qui suit:

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

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

Dans mon cas pour une API en .NET-Core, l'API est configurée pour fonctionner avec XML (par défaut, elle est définie sur response with JSON), j'ajoute donc cette annotation dans mon Controller:

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

Merci de m'avoir mis sur le chemin!

François Borgies
la source