在我的 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*******"
}
您的操作没有失败。
您的后端服务说它返回的响应类型未在您的客户端请求的 Accept HTTP 标头中提供。
参考:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields
找出 Service 返回的响应(内容类型)。在您的请求 Accept 标头中提供此(内容类型)。
http://en.wikipedia.org/wiki/HTTP_status_code -> 406
406 Not Acceptable 请求标识的资源只能生成响应实体,其内容特征根据请求中发送的accept headers不可接受。
当服务器无法使用请求中指定的接受标头进行响应时,会发生 406。在您的情况下,服务器似乎无法接受响应的 application/json 。
您提到您使用 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
它会解决你的问题。它对我有用:)
“有时”这可能意味着服务器有一个内部错误,并且想要响应错误消息(例如:带有 JSON 有效负载的 500),但由于请求标头没有说它接受 JSON,所以它返回 406。去搞清楚。 (在这种情况下:spring boot webapp)。
在这种情况下,您的操作确实失败了。但是失败的消息被另一个掩盖了。
当在浏览器中存储或引用无效 cookie 时,您也可能会收到 406 响应 - 例如,在本地以 Dev 模式运行 Rails 服务器时。
如果您碰巧在同一个端口上运行了两个不同的项目,浏览器可能会引用来自不同 localhost 会话的 cookie。
这发生在我身上......让我绊倒了一分钟。查看浏览器 > 开发人员模式 > 网络显示它。
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);
});
就我而言,我补充说:
Content-Type: application/x-www-form-urlencoded
完全解决了我的问题。
如果您使用的是“request.js”,则可以使用以下内容:
var options = {
url: 'localhost',
method: 'GET',
headers:{
Accept: '*/*'
}
}
request(options, function (error, response, body) {
...
})
对于 .NET-Core 中的 API,该 api 设置为使用 XML(默认设置为使用 JSON 响应),因此我在 Controller 中添加了此注释:
[Produces("application/xml")]
public class MyController : ControllerBase {...}
谢谢你让我走上这条路!
将标头更改为 Accept: */*
解决了我的问题并确保您没有任何其他接受标头
这也可能是由于防火墙阻止了请求。在我的情况下,请求有效负载包含字符串属性——“如 %abc%”和与符号“&”——这导致防火墙认为这是一种安全风险(例如 sql 注入攻击)并阻止了请求。请注意,该请求实际上并没有发送到服务器,而是在防火墙级别本身返回。
在我的例子中,没有生成应用程序服务器日志,所以我知道请求实际上并没有到达服务器并且在此之前被阻止。帮助我的日志是 Web 应用程序防火墙 (WAF) 日志。