我正在尝试使用 Jquery 发送 Ajax POST 请求,但遇到 400 bad request 错误。
这是我的代码:
$.ajax({
type: 'POST',
url: "http://localhost:8080/project/server/rest/subjects",
data: {
"subject:title":"Test Name",
"subject:description":"Creating test subject to check POST method API",
"sub:tags": ["facebook:work", "facebook:likes"],
"sampleSize" : 10,
"values": ["science", "machine-learning"]
},
error: function(e) {
console.log(e);
}
});
它说:无法根据请求构建资源。 我错过了什么?
最后,我遇到了错误,原因是我需要对发送的 JSON 数据进行字符串化。我必须在 XHR 对象中设置内容类型和数据类型。 所以正确的版本在这里:
$.ajax({
type: 'POST',
url: "http://localhost:8080/project/server/rest/subjects",
data: JSON.stringify({
"subject:title":"Test Name",
"subject:description":"Creating test subject to check POST method API",
"sub:tags": ["facebook:work", "facebook:likes"],
"sampleSize" : 10,
"values": ["science", "machine-learning"]
}),
error: function(e) {
console.log(e);
},
dataType: "json",
contentType: "application/json"
});
也许它会帮助别人。
以防其他人遇到这种情况。我有一个网站在桌面浏览器上运行良好,但在 Android 设备上却收到 400 错误。
原来是防伪令牌。
$.ajax({
url: "/Cart/AddProduct/",
data: {
__RequestVerificationToken: $("[name='__RequestVerificationToken']").val(),
productId: $(this).data("productcode")
},
问题是 .Net 控制器设置不正确。
我需要将属性添加到控制器:
[AllowAnonymous]
[IgnoreAntiforgeryToken]
[DisableCors]
[HttpPost]
public async Task<JsonResult> AddProduct(int productId)
{
代码需要审查,但现在至少我知道是什么原因造成的。 400错误根本没有帮助。
是的。您需要
stringify
JSON
数据,否则会出现 400 bad request
错误,因为它无法识别数据。
400 Bad Request
错误的请求。您的浏览器发送了该服务器无法发送的请求 明白了。
另外,您还需要添加
content type
和 datatype
。如果没有,您将遇到 415
错误,提示 Unsupported Media Type
。
415 不支持的媒体类型
试试这个。
var newData = {
"subject:title":"Test Name",
"subject:description":"Creating test subject to check POST method API",
"sub:tags": ["facebook:work", "facebook:likes"],
"sampleSize" : 10,
"values": ["science", "machine-learning"]
};
var dataJson = JSON.stringify(newData);
$.ajax({
type: 'POST',
url: "http://localhost:8080/project/server/rest/subjects",
data: dataJson,
error: function(e) {
console.log(e);
},
dataType: "json",
contentType: "application/json"
});
通过这种方式您可以轻松修改您需要的数据。它不会让你感到困惑,因为它是在 ajax 块之外定义的。
这个问题有点老了......但万一有人遇到错误 400,它也可能来自需要将 csrfToken 作为参数发布到 post 请求。
您必须从模板中的工艺中获取名称和值:
<script type="text/javascript">
window.csrfTokenName = "{{ craft.config.csrfTokenName|e('js') }}";
window.csrfTokenValue = "{{ craft.request.csrfToken|e('js') }}";
</script>
并在您的请求中传递它们
data: window.csrfTokenName+"="+window.csrfTokenValue
我希望这对那些在 WordPress 中使用 AJAX 时遇到 400 错误的人有用。尽管这个问题已经存在很多年了,但提供的解决方案都是程序化的,我相信许多人已经通过他们的代码反复发现它是正确的,但仍然发现它不起作用。
我发现了数十个结果询问如何解决“WP AJAX 请求返回 400 错误请求”或“WP AJAX 请求返回 0”,但今天没有任何效果。
谷歌搜索“如何修复 WordPress 上的 400 错误请求?”最终导致答案出现在 https://wp-umbrella.com/troubleshooting/400-bad-request-error-on-wordpress/
清除您的网络浏览器缓存和 Cookies
您可能会感到惊讶,WordPress 中的大多数 400 错误都可以通过清除浏览器的缓存和 cookie 来修复。浏览器缓存临时存储您访问的网站的图像、脚本和其他部分,以加快您的浏览体验。
清除缓存和 cookie 后,400 错误请求代码消失,结果按预期返回 AJAX 结果。
您需要使用以下函数从“数据”对象构建查询
function buildQuery(obj) {
var Result= '';
if(typeof(obj)== 'object') {
jQuery.each(obj, function(key, value) {
Result+= (Result) ? '&' : '';
if(typeof(value)== 'object' && value.length) {
for(var i=0; i<value.length; i++) {
Result+= [key+'[]', encodeURIComponent(value[i])].join('=');
}
} else {
Result+= [key, encodeURIComponent(value)].join('=');
}
});
}
return Result;
}
然后继续
var data= {
"subject:title":"Test Name",
"subject:description":"Creating test subject to check POST method API",
"sub:tags": ["facebook:work, facebook:likes"],
"sampleSize" : 10,
"values": ["science", "machine-learning"]
}
$.ajax({
type: 'POST',
url: "http://localhost:8080/project/server/rest/subjects",
data: buildQuery(data),
error: function(e) {
console.log(e);
}
});
就我而言,问题是通过 GET 发送的数据错误:
端点期望收到一封纯电子邮件,而接口正在发送一封电子邮件加上附加了一些“脏html”。
为什么会发生这种情况?最初目标字段是 INPUT,但在其他情况下 DIV 使用相同的 id ...
预期数据:
'[email protected]'
'[email protected]%20%3Cb%20class%3D....'
%20%3Cb%20class%3D => " <b class="... (was appended)
我做了什么?用新的 span id 元素包围电子邮件。
现在只获取 span insideHTML,而不是获取所有 DIV 内容。
之前,出现 400 错误:
<div id="x">[email protected] <b class="blue">To change it.... blabla
现在,好吧:
<div id="otherid"><span id="x">[email protected]</span> <b class="blue">To change it.... blabla