ChatGPT解决这个技术问题 Extra ChatGPT

什么是 HTTP 中的“406-不可接受的响应”?

在我的 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*******"
}

T
TheWhiteRabbit

您的操作没有失败。

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

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

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

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


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

406 Not Acceptable 请求标识的资源只能生成响应实体,其内容特征根据请求中发送的accept headers不可接受。

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


您没有删除标题,您必须提供服务器可以接受的不同标题。 en.wikipedia.org/wiki/…
P
Peter Mortensen

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

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


r
rogerdpack

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

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


e
etusm

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

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

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


J
JP Ventura
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);
});

M
Martin Tournoij

就我而言,我补充说:

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

完全解决了我的问题。


A
Alfredo Morales Pinzón

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

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

request(options, function (error, response, body) {
  ...
})

F
Francois Borgies

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

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

谢谢你让我走上这条路!


K
Kunal Tyagi

将标头更改为 Accept: */* 解决了我的问题并确保您没有任何其他接受标头


s
singh_v

这也可能是由于防火墙阻止了请求。在我的情况下,请求有效负载包含字符串属性——“如 %abc%”和与符号“&”——这导致防火墙认为这是一种安全风险(例如 sql 注入攻击)并阻止了请求。请注意,该请求实际上并没有发送到服务器,而是在防火墙级别本身返回。

在我的例子中,没有生成应用程序服务器日志,所以我知道请求实际上并没有到达服务器并且在此之前被阻止。帮助我的日志是 Web 应用程序防火墙 (WAF) 日志。