将数据发布到Cordova中的REST服务和内部服务器错误

时间:2015-08-26 19:37:37

标签: javascript android jquery cordova apigility

我使用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标题?

1 个答案:

答案 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发送。