2011-12-16 67 views
7

我在查询使用自定义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.'); 
    } 
}); 

这里的萤火虫标头输出:

选项 /服务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 Accept:text/html,application/xhtml + xml,application/xml; q = 0.9,/; q = 0.8Accept-Language:zh-cn,en; q = 0.5 Accept-Encoding:gzip,deflate Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7 Connection:keep -alive 来源:空 访问控制请求-方法:POST 访问控制请求报头:自定义标题键 杂注:无缓存 缓存控制:无缓存

以及用海报执行帖子时的smae头文件,它会返回所需的结果。

POST /服务HTTP/1.1 主机:server.com 的User-Agent:Mozilla的/ 5.0(Windows NT的6.1; WOW64; RV:8.0.1)壁虎/ 20100101火狐/ 8.0.1 接受:text/html,application/xhtml + xml,application/xml; q = 0.9,/; q = 0.8 Accept-Language:zh-cn,en; q = 0.5 Accept-Encoding:gzip,deflate Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7 Connection:keep-alive CUSTOM-HEADER-KEY:CUSTOM-HEADER-VALUE 杂注:无缓存 缓存控制:无缓存 的Content-Length:0

的区别是很明显的,但我不知道我在做什么错在jQuery代码。

任何人都可以帮助我吗?

+1

你发送此'跨服务器POST`请求​​能够把它发送到服务器? – Blender 2011-12-16 18:15:14

+0

搅拌机在正确的轨道上。这很可能是沙盒违规。无论是访问服务威盛jsonp或使用您的服务器作为服务的代理。 – John 2011-12-16 18:19:44

回答

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.'); 
    } 
}); 
2

这是一个跨域请求。所以你不能从浏览器端解决它。您可能需要服务器端代理才能执行POST到不同的域。

1

跨域呼叫上的任何自定义标题都会触发OPTIONS呼叫的预飞行请求。您需要绕过OPTIONS调用的安全检查或单独处理请求,因为自定义头文件不会与OPTIONS请求一起传递。此外,允许预先请求也不会造成任何伤害,因为没有实际数据通过该呼叫返回给浏览器。基本上,浏览器会询问服务器在实际制作之前是否允许进行该调用。您可能还需要检查您的Access-Control标题。所有这些更改都在服务器端,因此您需要完全控制Web服务。

5

在交叉域请求如果标头不被服务的浏览器允许将简单地将其删除

在第一浏览器的浏览器将作出OPTION呼叫来检查所允许的(产地,接头,方法)

在您的服务配置,你必须允许以头使用

Access-Control-Allow-Headers: YOUR_HEADER_NAME