抱歉,该网页目前还不存在中文版本,请继续浏览其他网页!

xwalk_hosts

XMLHttpRequest对象用于通过HTTP与远程服务器通信(例如大名鼎鼎的Ajax)。正常情况下,这些请求会被同源访问策略限制:只有与发出请求的脚本位于相同主机的资源才可以被访问。

如果你尝试从你的web应用访问资源,但是它们却位于不同的来源,你可能已经看到下列信息:

XMLHttpRequest cannot load http://crosswalk-project.org/. No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'file://' is therefore not allowed access.

这表明如果发出这样的请求,那么你要访问的服务器会返回正确的头部。这里提到的'Access-Control-Allow-Origin'头部是跨域资源共享规范的一部分。跨域的资源分享使得客户端可以向不同源的服务器发出请求,通过需要的header提供客户端和服务器的通信。然而实际上,很多你可能想要访问的web服务(除非你自己控制它们)在没有认证的情况下均不允许跨域的资源共享。

Crosswalk为部署在Android上的应用提供了一种绕开这些限制的方法。

允许跨域请求

Crosswalk提供了一个manifest字段,xwalk_hosts, 其中它可以保证在Android平台上应用可以使用XMLHttpRequest发出跨域请求。这样避免了同源的约束,同时也避免了使用跨域资源共享的需求。

这个字段包含一组代表应用可以访问的主机的URL模式。其中值完全可以表示主机名,像:

  • "http://crosswalk-project.org/"

或者通配符字符串的模式,例如:

  • "http://*.org/"
  • "https://*/"

例如,这个manifest将允许访问Crosswalk网站,或者任何intel.com子域:

{
  "name": "app name",
  "start_url": "index.html",
  "xwalk_hosts": [
    "http://crosswalk-project.org/",
    "http://*.intel.com/"
  ]
}

一旦你规定了应用可以访问的域名,XMLHttpRequest便可以照常向他们发送请求:

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://crosswalk-project.org/", true);
xhr.onreadystatechange = function () {
  if (xhr.readyState == 4) {
    // do something with xhr.responseText
  }
}
xhr.send();