你正在处理 CORS(跨域资源共享)。默认情况下,在所有浏览器中都会尊重此设置,所有 Web 服务器默认设置为不允许 CORS 请求。更多关于 CORS 的信息请查看
这里。
如果你是一名 Web 开发人员,并且有 Web 服务器但需要从 JavaScript 访问某些外部公司 API,最简单的方法是将你的服务器设置为代理服务器。以下是一些服务器的步骤:
(大师级读者可以在此添加更多服务器配置,因为我已经宣布这是一个维基百科)
使用 mod_proxy 和 mod_proxy_http 的 Apache
打开你的虚拟主机文件并添加以下行(首先启用 mod proxy,更多信息请参见
这里)。
ProxyPass /proxy http://domainname.com/
ProxyPassReverse /proxy http://domainname.com/
Nginx
如果您正在使用 Nginx 进行应用程序配置,请添加以下行:
location /proxy {
proxy_pass http://domainname.com/;
proxy_set_header X-Real-IP $remote_addr; <-- maybe good to set
}
关于此链接的更多阅读内容。
IIS
如果您正在使用IIS服务器,则配置比上述配置复杂一些,但您可以在此处找到有关它的所有信息。
对于以上所有示例,现在您可以使用Ajax和JSON从响应中作为您正在服务器上提供该API,而不是使用受限的JSONP功能。
是的,您也可以轻松地将其与Phonegap一起使用
我可以说一件事情。你要么选择蓝色药丸,要么选择红色药丸:) 我开玩笑了,但有两种方法。一种涉及拥有自己的服务器并进行上述配置,第二种是使用Phonegap本机插件。
第一种方法(网络服务器所有者)
需要您拥有自己的Web服务器。您将需要上面的mod_proxy配置,以便您可以将真实服务隐藏在您的服务后面,并代理来自您的phonegap应用程序的所有HTTP请求。您还必须在返回给phonegap应用程序的响应中包含CORS(跨源资源共享)标头。还要考虑使用身份验证来保护此内容,因为您正在向全世界公开内容。您的phonegap应用程序应通过HTTPS进行基本HTTP身份验证来认证您的Web服务。
按照以下步骤完成设置:
Apache
在apache服务器上,首先启用“headers”模块
$ a2enmod headers
在代理配置之前或之后的虚拟主机文件中添加以下内容:
ProxyPass /proxy http://domainname.com/
ProxyPassReverse /proxy http://domainname.com/
# CORS allow to all
Header set Access-Control-Allow-Origin *
# Set basic authentication
<Location /proxy>
AuthType Basic
AuthName "Restricted Area"
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
Require valid-user # setup user/password in file above using htpasswd
</Location>
在PhoneGap(Sencha Touch)中,对于Ajax请求设置用户名和密码,可以像使用buffer.SlowBuffer()一样进行操作。
您需要先使用第一种方法来打包认证头文件。
function make_base_auth(user, password) {
var tok = user + ':' + pass;
var hash = Base64.encode(tok);
return "Basic " + hash;
}
那么在您的代理中设置头部,方法如下:
headers : { Authorization : make_base_auth("some_username", "some_password") } // I know this is readable by other by you get the point.
IIS 6
要启用 Microsoft IIS6 的 CORS,请执行以下步骤:
- 打开 Internet Information Service (IIS) 管理器
- 右键单击要启用 CORS 的站点,然后转到属性
- 切换到 HTTP Headers 选项卡
- 在自定义 HTTP 标头部分,点击添加
- 将 Access-Control-Allow-Origin 输入为标头名称
- 将 * 输入为标头值
- 两次点击确定
可选的,设置基本身份验证,这是一个简单的过程。
IIS 7
还需考虑查看上述有关如何设置代理的文档,然后修改 web.config 文件并添加以下内容:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
nginx
在位置中添加以下内容
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 200;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
谷歌应用引擎也可以很有帮助
由于内容太长,无法适应此框,我将提供一个链接到其中一个博客的链接,其中所有内容都被正确解释了
链接
...那第二种方法呢
嗯,它涉及一些本地编码,至少您需要phonegap插件phonegap-proxy,您可以在这里找到它。但是,我会避免“native”,因为使用phonegap的重点在于使用单个代码具有多平台应用程序......哦,如果您想编写“特殊”插件来编写本地代码,在这里有一个很好的例子如何做同样的事情Facebook API
现在完全取决于您要采取哪种方法;)