HTTPの「406-Not Acceptable Response」とは何ですか?


185

Ruby on Railsアプリケーションで、POSTMAN RESTクライアントを介してBase64形式で画像をアップロードしようとしました。画像をPOSTすると、406 Not Acceptable Responseが返されます。データベースを確認したところ、画像があり、正常に保存されました。

このエラーの理由は何ですか、ヘッダーに指定する必要があるものはありますか?

私の要求:

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

ヘッダ:

Content-Type  -  application/json

生データ:

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

回答:


263

操作は失敗しませんでした。

バックエンドサービスが、クライアントリクエストのAccept HTTPヘッダーで返されているレスポンスタイプが提供されていないと言っています。

参照:http : //en.wikipedia.org/wiki/List_of_HTTP_header_fields

  1. サービスから返された応答(コンテンツタイプ)を調べます。
  2. これ(コンテンツタイプ)をリクエストのAcceptヘッダーに指定します。

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


6
こんにちは、「サービスから返された応答(コンテンツタイプ)を見つけてください」と言うとき?これをどのように確認できますか?私はphpファイルからjsonを返しているので、コンテンツタイプはjsonであると想定しています(または、これをphpファイルのヘッダーで指定する必要がありますか?)また、このコンテンツタイプをリクエストヘッダーに「Accept」のように指定しました: 「application / json」。これは正しいでしょうか?感謝
サラ

41

406 Not Acceptableリクエストで識別されたリソースは、リクエストで送信されたAcceptヘッダーに従って、許容できないコンテンツ特性を持つレスポンスエンティティを生成することのみ可能です。

406は、サーバーがリクエストで指定されたAccept-Headerで応答できない場合に発生します。あなたの場合、応答のapplication / jsonはサーバーに受け入れられないようです。


7
ヘッダーを削除する必要はありません。サーバーに受け入れられる別のヘッダーを指定する必要があります。en.wikipedia.org/wiki/...
アッシュートッシュライナ

7

Ruby on Railsをバックエンドとして使用しているとのことですが、あなたは関連するメソッドのコードを投稿しませんでしたが、私の推測では次のようになっていると思います:

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

それを次のように変更します。

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

そして、それはあなたの問題を解決します。それは私のために働いた:)


2

また、無効なCookieがブラウザに保存または参照されている場合(たとえば、RailsサーバーをローカルでDevモードで実行している場合)は、406応答を受け取ることがあります。

たまたま同じポートで2つの異なるプロジェクトを実行した場合、ブラウザーは異なるlocalhostセッションからのCookieを参照する可能性があります。

これは私に起こりました...少しの間私をつまずきました。ブラウザで見る>開発者モード>ネットワークはそれを示しました。


2

「ときどき」これは、サーバーに内部エラーがあり、エラーメッセージ(例:JSONペイロードを含む500)で応答したいことを意味する場合がありますが、リクエストヘッダーにJSONを受け入れたと記載されていないため、代わりに406を返します。図を行きます。(この場合:スプリングブートwebapp)。

その場合、操作は失敗しました。しかし、失敗メッセージは別のものによって覆い隠されました。



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

.NET-CoreのAPIの場合、APIはXMLで動作するように設定されているため(デフォルトではJSONでの応答に設定されています)、この注釈をコントローラーに追加します。

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

私を道に連れて行ってくれてありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.