Dojo.request for iteminfo-在Fiddler中返回代码200,但在浏览器中返回代码0
Dojo.request for iteminfo - return code 200 in Fiddler but 0 in the browser
除了URL地址和我调用服务的iteminfo
而不是层的addFeatures
之外,我对dojo.request
使用了与上一个项目中相同的代码。然而,我总是得到以下错误:
Unable to load http://foobar.com/arcgis/rest/services/MapServer/info/iteminfo status: 0
我在Firefox和IE中确认了这一点。Firebug或Visual Studio显示的状态总是0,尽管Fiddler显示的状态是200。当我把事情搞砸并在Fiddler中获得401时,它也会显示0。
所以,这是我的代码:
var promise = require('dojo/request').post(uri, {
handleAs: "json",
query: "f=pjson",
headers: {
"X-Requested-With": null
},
//timeout: 60000, //commenting this in and out changes nothing
withCredentials: true
});
var res = promise.isResolved();
var rej = promise.isRejected();
var ful = promise.isFulfilled();
var can = promise.isCanceled();
var respres = promise.response.isResolved();
var resprej = promise.response.isRejected();
var respful = promise.response.isFulfilled();
var respcan = promise.response.isCanceled();
promise.response.then(
//success
function (response) {
//something
},
//fail
function (error) {
//something different
}
);
我希望输出为JSON,所以我添加了query
选项;如果没有它,Fiddler将输出显示为HTML。我找到了一个答案,表明响应可能需要时间,但要么不是我的情况,要么需要比简单的timeout
选项更复杂的东西。
我的所有测试变量(res
、rej
…)都包含false
。因此,代码中的请求似乎未解决、未完成等,但Fiddler返回了响应——我在这些网络艺术方面不够熟练,无法从中得出结论,所以我问了这个问题。
此外,我有一个模糊的印象,一些额外的标题应该是解决方案。我试着添加了accept
(没有任何变化)和content-type
(它在飞行前进行,Fiddler报告状态401)。
编辑:响应标头包含以下安全信息:
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Origin: http://localhost:30322 //origin for now
Access-Control-Allow-Origin: *
浏览器(出于安全原因)对跨域请求的要求越来越严格,可能会简单地拒绝加载跨域资源,即使它的状态为200,而是显示0。因此,如果您在dojo请求中使用的uri中的域与站点uri中的域名不同,这可能是问题所在。
请注意,只需添加一个端口号即可获得不同的域,这将被视为跨域请求。
为了解决这个问题,你可以在你的域上发出所有请求,并在你的dojo请求uri中添加一些东西,让你的web服务器将请求代理到外部服务器,例如:
RewriteRule /arcgis/(.*) http://foobar.com/arcgis/$1 [L,P]
ProxyPassReverse /arcgis http://foobar.com/arcgis
否则,您必须手动指定来自站点域的跨域请求是可以的。foobar.com服务器需要将具有域值的HTTP标头Access Control Allow Origin添加到响应中,您的浏览器将接受它。添加具有值*的标头Access Control Allow Origin将接受来自任何域的跨域名请求,但显然不太安全。
我试图预先处理请求。发送的OPTIONS请求似乎还可以,但我们的服务器需要对其进行身份验证,导致错误401。我不想尝试破解OPTIONS请求,所以这实际上只能在服务器端解决。由于这一切的目的只是测试,在生产中,一切都将在服务器上或代理后面,我们决定使用一些肮脏的解决方法,比如现在将JSON缓存在文件中。
对于Access-Control-Allow-Origin
还不够的原因,我认为POST可能是罪魁祸首。它与JSON-P和简单的CORS请求都不兼容。另外,我从来没有Access-Control-Allow-Methods
响应标头,所以它们的缺失可能会阻止请求。不过我不确定。
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 返回按钮代码段的Jquery冲突
- .val()返回未定义的.text返回随机代码
- 如何使HTML5颜色选择器返回颜色名称而不是颜色代码
- 为什么这个代码返回NaN
- 这个代码会返回false吗
- 如何从一系列级联异步代码中返回值
- 角度方法返回未绘制的代码
- 我可以获得用Ajax调用的函数的返回代码吗
- 我无法从javascript函数中获取返回代码
- 无法获取输出.返回代码206.缺少值
- 在 cordova 项目中,我正在使用文件传输插件上传个人资料照片,它总是返回代码 1 错误
- AngularJS: $sce.trustAsHtml 以文本形式返回代码
- 带有返回代码和返回消息的 PHP 函数,以供参考
- Dojo.request for iteminfo-在Fiddler中返回代码200,但在浏览器中返回代码0
- 解析云代码:beforeSave查询返回代码不起作用
- AJAX返回代码200,但引发错误
- XMLHttpRequest运行返回代码
- ASP.NET:如何传递窗口.返回C#代码的值
- NodeJS: HTTP GET返回代码而不是JSON对象