【问题标题】:What is "406-Not Acceptable Response" in HTTP?什么是 HTTP 中的“406-不可接受的响应”?
【发布时间】:2026-02-01 15:20:09
【问题描述】:

在我的 Ruby on Rails 应用程序中,我尝试通过 POSTMAN REST 客户端以 Base64 格式上传图像。当我发布图像时,我收到 406 Not Acceptable Response。当我检查我的数据库时,图像在那里并且成功保存。

这个错误的原因是什么,我需要在我的标题中指定什么吗?

我的要求:

网址---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*******"
}

【问题讨论】:

标签: json rest http http-response-codes http-status-code-406


【解决方案1】:

您的操作没有失败。

您的后端服务说它返回的响应类型未在您的客户端请求的 Accept HTTP 标头中提供。

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

  1. 找出Service返回的响应(内容类型)。
  2. 在您的请求 Accept 标头中提供此(内容类型)。

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

【讨论】:

  • 嗨,当您说“找出服务返回的响应(内容类型)”时?我该如何检查这个?我正在从 php 文件返回 json,所以我假设内容类型将是 json(或者我需要在 php 文件的头文件中指定这个吗?)我也在我的请求头文件中提供了这个内容类型,就像“接受”一样: '应用程序/json'。这是正确的吗?谢谢
【解决方案2】:

406 不可接受 请求标识的资源只能生成具有内容特征的响应实体 根据请求中发送的接受标头接受。

406 发生在服务器无法使用请求中指定的接受标头进行响应时。 在您的情况下,服务器似乎无法接受响应的 application/json。

【讨论】:

【解决方案3】:

您提到您使用 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

它会解决你的问题。它对我有用:)

【讨论】:

    【解决方案4】:

    “有时”这可能意味着服务器有一个内部错误,并希望以错误消息进行响应(例如:500 带有 JSON 有效负载)但由于请求标头没有说它接受 JSON,它返回一个 406反而。去搞清楚。 (在这种情况下:spring boot webapp)。

    在这种情况下,您的操作确实失败了。但是失败消息被另一个隐藏了。

    【讨论】:

      【解决方案5】:

      当在浏览器中存储或引用无效 cookie 时,您也可能会收到 406 响应 - 例如,在本地以开发模式运行 Rails 服务器时。

      如果您碰巧在同一个端口上运行了两个不同的项目,浏览器可能会引用来自不同 localhost 会话的 cookie。

      这件事发生在我身上......让我绊倒了一分钟。在浏览器中查看 > 开发者模式 > 网络显示它。

      【讨论】:

        【解决方案6】:

        就我而言,我补充说:

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

        彻底解决了我的问题。

        【讨论】:

          【解决方案7】:
          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);
          });
          

          【讨论】:

            【解决方案8】:

            如果您使用的是“request.js”,则可以使用以下内容:

            var options = {
              url: 'localhost',
              method: 'GET',
              headers:{
                Accept: '*/*'
              }
            }
            
            request(options, function (error, response, body) {
              ...
            })
            

            【讨论】:

              【解决方案9】:

              对于 .NET-Core 中的 API,该 api 设置为使用 XML(默认设置为使用 JSON 响应),因此我在控制器中添加了此注释:

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

              谢谢你让我走上这条路!

              【讨论】: