Co to jest „406 nieakceptowalna odpowiedź” w HTTP?

185

W mojej aplikacji Ruby on Rails próbowałem przesłać obraz przez klienta POSTMAN REST w formacie Base64 . Po wysłaniu obrazu otrzymuję odpowiedź 406 niedopuszczalną . Kiedy sprawdziłem moją bazę danych, obraz był tam i został pomyślnie zapisany.

Jaki jest powód tego błędu, czy jest coś, co muszę podać w nagłówku?

Moja prośba:

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

Nagłówek:

Content-Type  -  application/json

Surowe dane:

{
    "exercise": {
        "subbodypart_ids": [
            "1",
            "2"
        ],
        "name": "Exercise14"
    },
    "image_file_name": "Pressurebar Above.jpg",
    "image":"******base64 Format*******"
}
Cyber
źródło

Odpowiedzi:

263

Twoja operacja nie zakończyła się niepowodzeniem.

Twoja usługa zaplecza mówi, że zwracany typ odpowiedzi nie jest podany w nagłówku Akceptuj HTTP w żądaniu klienta.

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

  1. Znajdź odpowiedź (typ zawartości) zwróconą przez usługę.
  2. Podaj ten (typ zawartości) w nagłówku żądania Akceptuj.

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

TheWhiteRabbit
źródło
6
Cześć, kiedy mówisz „Dowiedz się, jaka odpowiedź (typ zawartości) została zwrócona przez usługę”? Jak mogę to sprawdzić? Zwracam json z pliku php, więc domyślam się, że typem zawartości będzie json (czy muszę to określić w nagłówkach pliku php?). Podałem ten typ zawartości w nagłówku żądania, tak jak „Akceptuj”: „application / json”. czy to byłoby poprawne? dzięki
Sarah,
41

406 Niedopuszczalne Zasób zidentyfikowany przez żądanie jest zdolny do generowania jednostek odpowiedzi, których właściwości treści są niedopuszczalne zgodnie z nagłówkami akceptacji wysłanymi w żądaniu.

406 dzieje się, gdy serwer nie może odpowiedzieć nagłówkiem accept określonym w żądaniu. W twoim przypadku wydaje się, że aplikacja / json dla odpowiedzi może nie być akceptowalna dla serwera.

ashutosh raina
źródło
7
Nie masz usuniętego nagłówka, musisz podać inny, akceptowalny dla serwera. en.wikipedia.org/wiki/…
ashutosh raina
7

Wspomniałeś, że używasz Ruby on Rails jako backendu. Nie opublikowałeś kodu odpowiedniej metody, ale domyślam się, że wygląda to tak:

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

Zmień na:

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

I to rozwiąże twój problem. To zadziałało dla mnie :)

itamaryu
źródło
2

Możesz także otrzymać odpowiedź 406, gdy nieprawidłowe pliki cookie są przechowywane lub są wywoływane w przeglądarce - na przykład, gdy lokalnie działa serwer Rails w trybie deweloperskim.

Jeśli zdarzyło Ci się uruchomić dwa różne projekty na tym samym porcie, przeglądarka może odwoływać się do pliku cookie z innej sesji localhost.

To mi się przydarzyło ... wpadło mi na minutę. Przeglądarka> Tryb programisty> Sieć to pokazała.

etusm
źródło
2

„Czasami” może to oznaczać, że serwer miał błąd wewnętrzny i chciał odpowiedzieć komunikatem o błędzie (np. 500 z ładunkiem JSON), ale ponieważ nagłówki żądania nie powiedziały, że zaakceptował JSON, zamiast tego zwraca 406. Domyśl. (w tym przypadku: aplikacja webowa rozruchu wiosennego).

W takim przypadku operacja nie powiodła się. Ale komunikat o awarii został zasłonięty przez inny.

rogerdpack
źródło
1

W moim przypadku dodałem:

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

całkowicie rozwiązał mój problem.

Kadir Erturk
źródło
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
źródło
0

Jeśli używasz pliku „request.js”, możesz użyć:

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

request(options, function (error, response, body) {
  ...
})
Alfredo Morales Pinzón
źródło
0

W moim przypadku dla interfejsu API w .NET-Core, interfejs API jest ustawiony do pracy z XML (domyślnie jest ustawiony na odpowiedź z JSON), więc dodaję tę adnotację do mojego kontrolera:

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

Dziękuję za postawienie mnie na ścieżce!

Francois Borgies
źródło