我正在尝试使用Jquery发送Ajax POST请求,但我遇到了400个错误的请求错误。
这是我的代码:
$.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);
}
});
它说:无法根据请求构建资源。 我错过了什么?
答案 0 :(得分:87)
最后,我弄错了,原因是我需要对我发送的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"
});
可能会帮助别人。
答案 1 :(得分:1)
这个问题有点旧......但是,如果有人面临错误400,也可能需要将csrfToken作为参数发布到帖子请求。
您必须在模板中获取工艺品的名称和价值:
<script type="text/javascript">
window.csrfTokenName = "{{ craft.config.csrfTokenName|e('js') }}";
window.csrfTokenValue = "{{ craft.request.csrfToken|e('js') }}";
</script>
并在您的请求中传递它们
data: window.csrfTokenName+"="+window.csrfTokenValue
答案 2 :(得分:1)
以防其他任何人遇到这个问题。我有一个可以在桌面浏览器上正常运行的网站,但是我在使用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错误根本没有帮助。
答案 3 :(得分:0)
您需要从&#34;数据&#34;构建查询使用以下函数的对象
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);
}
});
答案 4 :(得分:0)
是。您需要stringify
发生JSON
数据orlse 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块之外定义的。