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();
中文版
