我正在查询使用自定义http标头进行身份验证的REST Web服务。
如果我执行没有标题的POST我得到了预期的错误,但是当我添加标题时,我得到404错误而不是我实际需要的错误。
这是我的代码
$.ajax({
type: 'POST',
url: 'http://server.com/service',
beforeSend: function (xhr) { xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') },
success: function(data) {
alert('success.');
}
});
这是firebug标题输出:
选项 / service HTTP / 1.1 主持人:server.com User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:8.0.1)Gecko / 20100101 Firefox / 8.0.1 接受:text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8 Accept-Language:en-us,en; q = 0.5 Accept-Encoding:gzip,deflate Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7 连接:保持活力 来源:null 访问控制请求方法:POST 访问控制请求标头:custom-header-key Pragma:没有缓存 缓存控制:无缓存
和使用海报执行帖子时的smae标题,返回所需的结果。
POST / service HTTP / 1.1 主持人:server.com User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:8.0.1)Gecko / 20100101 Firefox / 8.0.1 接受:text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8 Accept-Language:en-us,en; q = 0.5 Accept-Encoding:gzip,deflate Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7 连接:保持活力 CUSTOM-HEADER-KEY:CUSTOM-HEADER-VALUE Pragma:没有缓存 缓存控制:无缓存 内容长度:0
区别很明显,但我不知道我在jquery代码中做错了什么。
有人可以帮我吗?
答案 0 :(得分:5)
在跨域请求中,如果服务浏览器不允许标头,则只需将其删除
首先,浏览器浏览器会进行OPTION调用以检查是否允许(Origin,Headers,Methods)
在您的服务配置中,您必须允许标头才能使用
将其发送到服务器Access-Control-Allow-Headers: YOUR_HEADER_NAME
答案 1 :(得分:2)
这是跨域请求。所以你无法从浏览器端解决它。您可能需要服务器端代理才能对其他域执行POST。
答案 2 :(得分:1)
这可能有所帮助,但我认为您可以在数据选项中添加标题:
$.ajax({
type: 'POST',
data: put the results of your header request here,
url: 'http://server.com/service',
beforeSend: function (xhr) { xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') },
success: function(data) {
alert('success.');
}
});
答案 3 :(得分:1)
跨域调用上的任何自定义标头都会触发一个OPTIONS调用之前的请求。您需要绕过OPTIONS调用的安全检查或单独处理请求,因为自定义标头未通过OPTIONS请求传递。允许飞行前请求也没有坏处,因为没有实际数据通过该调用传递回浏览器。基本上,浏览器会询问服务器是否允许在实际制作之前拨打该电话。您可能还需要检查Access-Control标头。所有这些更改都在服务器端btw,因此您需要完全控制Web服务。