我尝试使用Angular $ http和以下代码进行跨源POST请求。
//I've tried setting and removing these http config options
$http.defaults.useXDomain = true;
delete $http.defaults.headers.common['X-Requested-With'];
$http.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded';
//Basic request, with some private headers removed
return $http({
method: 'POST',
//withCredentials:true,
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
params: params,
url: url
});
预检OPTIONS请求获得200 OK
,但后续POST收到400 Bad Request
响应。查看Chrome调试窗口中的跟踪,我没有看到POST的Content-Type: application/x-www-form-urlencoded; charset=UTF-8
标头。我假设这就是服务器返回错误请求响应的原因。
我设置了一些我从上面的代码中省略的其他自定义标题,并且它们正在被发送并显示正常。
我还应该提一下,我可以使用Chrome的Advanced Rest Client应用程序发出此请求并收到正确的回复。 (访问令牌)
我也试过做一个直接的XMLHttpRequest(),但是我得到了同样的错误。
有关我的Content-Type标头未设置原因的任何见解?
答案 0 :(得分:11)
如果您没有发送任何数据,我不确定会发送Content-Type
标头。添加data
对象并尝试:
return $http({
method: 'POST',
//withCredentials:true,
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
data: data,
url: url
});
另外,通常在帖子中使用data
代替params
(获取)。
如果需要,您还可以参考此SO问题,其中包含有关如何转换数据的更多信息:How can I post data as form data instead of a request payload?
答案 1 :(得分:7)
如果未定义数据属性,则不会将“Content-Type”标头添加到请求中,例如,您可以将空字符串作为数据“”发送。
var req = {
method: 'GET',
url: '<your url here>',
//headers: {
// 'Content-Type': 'application/json;charset=utf-8'
//},
data: ""
};
$http(req);
答案 2 :(得分:1)
我的问题是我将data
变量设置为对象而不是字符串。
return $http({
method: 'POST',
//withCredentials:true,
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
data: {'key1':'value1', 'key2':'value2'},
url: url
});
我将其更改为data:'key1=value1&key2=value2'
后效果很好。还有一个反斜杠,我必须手动输入%5c
代码。
答案 3 :(得分:1)
比你非常多&#34; Liran B&#34;你的修复工作对我来说就像一个冠军....问题让我困扰了几个小时....
var req = {
method: 'GET',
url: '<your url here>',
//headers: {
// 'Content-Type': 'application/json;charset=utf-8'
//},
data: ""
};
$http(req);
答案 4 :(得分:1)
我在设置标题时面临同样的问题。我们需要在$http
请求中发送数据参数,如此
$http({
method: 'POST',
headers: { 'Content-Type': 'application/json},
data: {},
url: url
});
我们也可以发送空白数据。它会工作正常。