我正在尝试使用dojo.xhrGet发出请求从服务器获取一些XML数据。我正在使用dojo 1.4.0。
服务器要求我通过名为Myauthtoken
的自定义HTTP标头传递凭据。
在Safari中一切正常。代码会弹出一个显示[object Document]
的对话框。但在Firefox中,对话框显示null
。在整个过程中,自定义标头被删除或损坏,服务器不接受它。
相关代码如下所示:
dojo.xhrGet({
url: 'https://host.com/path/to/thing?param1=one¶m2=two',
headers: {
'Myauthtoken': 'username:password'
},
handleAs: 'xml',
load: function(response) {
alert(response);
},
error: function(e) {
alert("error: " + e);
}
});
在Firefox中,Firebug显示以下请求标头:
主持人: host.com
用户代理: Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.7)Gecko / 20091221 Firefox / 3.5.7
接受: text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8
接受语言: en-us,en; q = 0.5
接受编码: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8; q = 0.7,*; q = 0.7
保持活力: 300
连接:保持活力
原产地: null
访问控制 - 请求 - 方法: GET
访问控制请求标头: myauthtoken,x-requested-with
服务器响应403(禁止)和这些响应标题:
日期:周四,2010年1月28日20:02:47 GMT
服务器: Noelios-Restlet-Engine / 1.0.6
内容类型: text / html;字符集= ISO-8859-1
内容长度:337
连接:关闭
更新! 我一直在研究,看起来问题是Firefox正在尝试preflight the request because of the custom headers,而Safari不是,而只是发送自定义标头而不先检查它们是否有效。
我也想出了how to look at the Request in Safari:
缓存控制: max-age = 0
内容类型: application / x-www-form-urlencoded
Myauthtoken:用户名:密码
用户代理: Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10_5_8; zh-CN)AppleWebKit / 531.21.8(KHTML,类似Gecko)版本/ 4.0.4 Safari / 531.21.10
响应标题:
缓存控制:无存储
连接:关闭
内容长度: 236391
内容类型: application / xml;字符集= ISO-8859-1
日期:周五,2010年1月29日23:02:22 GMT
服务器: Noelios-Restlet-Engine / 1.0.6
主要区别在于Content-Length: 235391
不幸的是,我仍然没有更接近实际找到解决方案 - 仍然在寻找一些好的想法,或者根本没有任何想法。
对于发生了什么以及如何解决这个问题的任何想法?
谢谢!
答案 0 :(得分:2)
经过一番研究后,看起来问题是服务器期望标题区分大小写,而Firefox正在将标题转换为小写。
Firefox正在发送myauthtoken
,而服务器正在发送Myauthtoken
。
最后,我们使用的是getFirstValue(String name)
的一些代码,它默认为区分大小写,而不是getFirstValue(String name, boolean ignoreCase)
。
注意区分大小写的标题!
答案 1 :(得分:0)
对于自定义标头,我认为您需要使用X-
前缀:
X-Myauthtoken:用户名:密码
headers: {
'X-Myauthtoken': 'username:password'
},
服务器也需要接受它,因为它是非标准的标题。