Was ist "406-nicht akzeptable Antwort" in HTTP?

185

In meiner Ruby on Rails-Anwendung habe ich versucht, ein Bild über den POSTMAN REST- Client im Base64- Format hochzuladen . Wenn ich das Bild poste, erhalte ich eine 406 Not Acceptable Response . Als ich meine Datenbank überprüfte, war das Bild dort und wurde erfolgreich gespeichert.

Was ist der Grund für diesen Fehler? Muss ich etwas in meinem Header angeben?

Meine Anfrage:

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

Header:

Content-Type  -  application/json

Rohdaten:

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

Antworten:

263

Ihre Operation ist nicht fehlgeschlagen.

Ihr Backend-Service gibt an, dass der zurückgegebene Antworttyp nicht im Accept HTTP-Header in Ihrer Client-Anfrage angegeben ist.

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

  1. Finden Sie die vom Service zurückgegebene Antwort (Inhaltstyp) heraus.
  2. Geben Sie dies (Inhaltstyp) in Ihrer Anfrage an. Akzeptieren Sie den Header.

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

TheWhiteRabbit
quelle
5
Hallo, wenn Sie sagen "Finden Sie die Antwort (Inhaltstyp) heraus, die vom Dienst zurückgegeben wird"? Wie kann ich das überprüfen? Ich gebe json von einer PHP-Datei zurück, also gehe ich davon aus, dass der Inhaltstyp json ist (oder muss ich dies in den Headern der PHP-Datei angeben?). Außerdem habe ich diesen Inhaltstyp in meinem Anforderungsheader wie folgt angegeben: 'Akzeptieren': 'application / json'. wäre das richtig danke
Sarah
41

406 Nicht akzeptabel Die durch die Anforderung identifizierte Ressource kann nur Antwortentitäten generieren, deren Inhaltsmerkmale gemäß den in der Anforderung gesendeten Akzeptanzheadern nicht akzeptabel sind.

406 tritt auf, wenn der Server nicht mit dem in der Anforderung angegebenen Accept-Header antworten kann. In Ihrem Fall scheint application / json für die Antwort für den Server möglicherweise nicht akzeptabel zu sein.

Ashutosh Raina
quelle
7
Sie müssen den Header nicht entfernen, sondern müssen einen anderen angeben, der für den Server akzeptabel ist. en.wikipedia.org/wiki/…
ashutosh raina
7

Sie haben erwähnt, dass Sie Ruby on Rails als Backend verwenden. Sie haben den Code für die entsprechende Methode nicht veröffentlicht, aber ich vermute, dass er ungefähr so ​​aussieht:

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

Ändern Sie es in:

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

Und es wird Ihr Problem lösen. Es hat bei mir funktioniert :)

itamaryu
quelle
2

Sie können auch eine 406-Antwort erhalten, wenn ungültige Cookies im Browser gespeichert sind oder auf die verwiesen wird - beispielsweise wenn ein Rails-Server lokal im Dev-Modus ausgeführt wird.

Wenn Sie zufällig zwei verschiedene Projekte auf demselben Port ausgeführt haben, verweist der Browser möglicherweise auf ein Cookie aus einer anderen localhost-Sitzung.

Das ist mir passiert ... hat mich für eine Minute gestolpert. Ein Blick in Browser> Entwicklermodus> Netzwerk zeigte es.

Etusm
quelle
2

"Manchmal" kann dies bedeuten, dass der Server einen internen Fehler hatte und mit einer Fehlermeldung antworten wollte (Beispiel: 500 mit JSON-Nutzdaten). Da die Anforderungsheader jedoch nicht sagten, dass JSON akzeptiert wurde, wird stattdessen eine 406 zurückgegeben. Stelle dir das vor. (in diesem Fall: Spring Boot Webapp).

In diesem Fall ist Ihre Operation fehlgeschlagen. Aber die Fehlermeldung wurde von einem anderen verdeckt.

Rogerdpack
quelle
1

In meinem Fall habe ich hinzugefügt:

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

löste mein Problem vollständig.

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

Wenn Sie 'request.js' verwenden, können Sie Folgendes verwenden:

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

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

In meinem Fall für eine API in .NET-Core ist die API so eingestellt, dass sie mit XML funktioniert (standardmäßig ist sie so eingestellt, dass sie mit JSON antwortet). Daher füge ich diese Anmerkung meinem Controller hinzu:

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

Danke, dass du mich auf den Weg gebracht hast!

Francois Borgies
quelle