javascript - Dojo.request for iteminfo - 在 Fiddler 中返回代码 200,但在浏览器中返回代码 0

标签 javascript json dojo arcgis-js-api

我对 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 选项更复杂的东西。

我的所有测试变量(resrej...)都保持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

否则,您必须手动指定来自您网站域的跨域请求是可以的。 foob​​ar.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/

相关文章:

javascript - 在中央 Pane 中对齐按钮和下拉按钮

javascript - 使用数组解析外部 JSON 并保存

json - 如何使用mochijson在erlang中编码数据结构?

javascript - 如何在 ProtractorJS 中扩展 ElementFinder 对象?

javascript - fullcalendar v4 modif ajax 问题 + event.setDates 语法错误

ios - Alamofire JSON 请求不从服务器中提取数据

javascript - Dojo使用延迟函数在ajax回调函数中获取数据

javascript - 如何在 dojo 路由器中显示 View ?

javascript - 有条件地显示警报组件,并可选择从 View 中删除组件

javascript - 为什么 Javascript 将数字视为二进制补码