我对 dojo.request
使用与 a previous project 中相同的代码,除了 URL 地址以及我正在调用服务的 iteminfo
而不是层的 addFeatures
的事实。但是,我总是收到以下错误:
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。我找到了answer表明响应可能需要时间,但要么不是我的情况,要么需要比简单的 timeout
选项更复杂的东西。
我的所有测试变量(res
、rej
...)都保持false
。因此,请求在代码中似乎未解决、未实现等,但 Fiddler 返回了响应 - 我在这些网络艺术方面不够熟练,无法从中得出结论,所以我问这个问题。
此外,我有一个模糊的印象,一些额外的 header 应该是解决方案。我尝试添加 accept
(没有任何改变)和 content-type
(它变成 pre-flight 并且 Fiddler 报告状态 401)。
编辑:响应 header 包含以下安全信息:
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 header Access-Control-Allow-Origin 和您的域值添加到响应中,您的浏览器将接受它。添加值为 * 的 Access-Control-Allow-Origin header 将接受来自任何域的跨域请求,但显然安全性较低。
关于javascript - Dojo.request for iteminfo - 在 Fiddler 中返回代码 200,但在浏览器中返回代码 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34632589/