我使用Cordova 5.2.0为Android创建一个简单的移动应用程序,我尝试使用Apigility 1.3.1向服务器发送POST请求以及一个名为“ZfrCors”的附加模块' (ZfrCors是一个简单的Zend Framework 2模块,可以帮助您处理跨源资源共享),但服务器响应状态为500(内部服务器错误)。可能这个错误导致标题帖子像" Origin:file://"
我使用Wireshark浏览日志并查看:
POST /mobileapp/user HTTP/1.1
Host: api.XXX.com
Connection: keep-alive
Content-Length: 15
Accept: */*
Origin: file://
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
Content-Type: application/json
Accept-Encoding: gzip, deflate
Accept-Language: en-US;q=0.6,en;q=0.4
{"name":"test"}
这是我的JavaScript代码:
var data = {
name: 'test'
};
$.ajax({
method: 'POST',
url: 'http://api.XXX.com/mobileapp/user',
data: JSON.stringify(data),
contentType: 'application/json',
error: function(jqXHR, textStatus, errorThrown)
{
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
alert('error');
},
success: function(data, textStatus, jqXHR)
{
alert('success');
}
});
Config.xml文件(Cordova配置)包含
<access origin="http://api.XXX.com/mobileapp/user" />
此外,index.html文件的HEAD包括
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">
在服务器端ZF2模块&#39; ZfrCors&#39;似乎配置正确,因为当我创建一个POST请求时,例如,通过Firefox的&#39; HttpRequester&#39; -add-on,没有标题&#34;来源:file://&#34;一切正常
zfr_cors.global.php
return array(
'zfr_cors' => array(
'allowed_origins' => array('*'),
'allowed_methods' => array('GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'),
'allowed_headers' => array('*'),
// 'max_age' => 120,
// 'exposed_headers' => array(),
//'allowed_credentials' => true,
));
在我看来问题是Cordova,Webview发送错误的Origin标题?
答案 0 :(得分:0)
我也遇到过Phonegap应用程序的这个问题。
我在这里找到了一个解决方法:https://github.com/zf-fr/zfr-cors/issues/18
您应该在onBootstrap中添加此代码(或类似代码):
$eventManager = $e->getApplication()->getEventManager();
$headers = $e->getRequest()->getHeaders();
if ($headers->has('Origin')) {
//convert to array because get method throw an exception
$headersArray = $headers->toArray();
$origin = $headersArray['Origin'];
if ($origin === 'file://') {
unset($headersArray['Origin']);
$headers->clearHeaders();
$headers->addHeaders($headersArray);
//this is a valid uri
$headers->addHeaderLine('Origin', 'file://mobile');
}
}
或者,如果您想要更严格的代码,可以在上面的链接中找到。
这些问题在zfr-cors上已经关闭,所以我认为zfr-cors的官方解决方案不会像file://如何使用cordova / phonegap发送。