模拟Cordova App

时间:2016-08-22 07:13:02

标签: php ajax cordova session ripple

这让我很难过。

我正在使用apache cordova构建移动应用程序,其中jQuery AJAX和PHP用于与服务器和数据库进行通信。我第一次发现这个问题时遇到了我的队友没有的错误,我们使用了相同的代码。在我们的一些PHP代码中,我们使用$_SESSION变量来存储数据,但在我的机器上运行应用程序时却没有正确存储。以下是无法运行的代码示例:

<?php

header('Access-Control-Allow-Origin : *');
include 'connection.php';

$userId = $_SESSION["userId"];

$query = "SELECT * ".
         "FROM `db`.`users` ".
         "WHERE `userId` = $userId;";

$result = $conn->query($query);
$result_array = array();
while($row = mysqli_fetch_assoc($result))
{
    $result_array[] = $row;
}
echo json_encode($result_array);

在之前运行的页面中,调用包含此行的不同php文件:

$_SESSION["userId"] = $userId;

include connection.php包含我们所有的用户/登录信息以及session_start();。解决方法是这样的:当我构建应用程序并在设备上测试它时,不会发生此错误。它只在我的机器上通过Chrome浏览器窗口中的纹波仿真器调试应用程序时发生。因为我不想频繁地创建新构建,所以我使用sessionStorage更改了代码以将数据存储在前端,并且必须在模拟器上禁用跨域代理设置。

这是我认为错误的地方:除非我将跨域代理设置为“已禁用”,否则我的AJAX调用都不成功,但如果我这样做,则PHP $_SESSION不再有效(我发现了会话ID只是重置每个新的呼叫)。我的队友可以在模拟器上进行调试,并将他的跨域代理设置为“本地”。当我这样尝试时,我的所有AJAX调用再次出错。

另外 - 最后要注意的一点是:当我在网络浏览器中运行应用程序时,不使用涟漪模拟器或任何东西,一切都运行得很好。这会将问题缩小到特定的纹波仿真器。

我对这个东西比较新 - CORS和AJAX请求,但我在发布之前做了一些认真的研究 - 这是我的最后一招。我将经常监控这个问题,以防你需要我的任何其他帮助我解决这个问题。谢谢!

编辑:以下是我在进行一些建议更改后从命令行运行ripple emulate时出现的错误,这是我之前遇到的错误:

 C:\Users\Brian\Documents\HoH Docs\Source Code\gitDev\HoH\www>ripple emulate
INFO: Server instance running on: http://localhost:4400
INFO: CORS XHR proxy service on: http://localhost:4400/ripple/xhr_proxy
INFO: JSONP XHR proxy service on: http://localhost:4400/ripple/jsonp_xhr_proxy
INFO: Could not find cordova as a local module. Expecting to find it installed g
lobally.
INFO: Using Browser User Agent (String)
INFO: Proxying cross origin XMLHttpRequest - http://www.server.com/php/
signIn.php?email=b_dz@gmail.com&password=test
_http_outgoing.js:347
      throw new TypeError(
      ^

TypeError: Trailer name must be a valid HTTP Token ["access-control-allow-origin
 "]
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:347:13)
    at ServerResponse.res.setHeader (C:\Users\Brian\AppData\Roaming\npm\node_mod
ules\ripple-emulator\node_modules\express\node_modules\connect\lib\patch.js:59:2
2)
    at Request.pipeDest (C:\Users\Brian\AppData\Roaming\npm\node_modules\ripple-
emulator\node_modules\request\main.js:723:12)
    at C:\Users\Brian\AppData\Roaming\npm\node_modules\ripple-emulator\node_modu
les\request\main.js:614:14
    at Array.forEach (native)
    at ClientRequest.<anonymous> (C:\Users\Brian\AppData\Roaming\npm\node_module
s\ripple-emulator\node_modules\request\main.js:613:18)
    at ClientRequest.g (events.js:260:16)
    at emitOne (events.js:77:13)
    at ClientRequest.emit (events.js:169:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:433:21
)

在提出请求时从Fiddler Web Debugger获取此信息:

The connection to 'localhost' failed. <br />Error: ConnectionRefused (0x274d). <br />System.Net.Sockets.SocketException No connection could be made because the target machine actively refused it 127.0.0.1:4400                                                                                                                                                                                                                                                                                                     

2 个答案:

答案 0 :(得分:1)

这很可能是你的问题:

header('Access-Control-Allow-Origin : *');
include 'connection.php';

在包含启动会话的连接文件之前,您正在向浏览器发送标头。

在某些测试环境中,可能会打开输出缓冲,因此可以使用。但是,在您的环境中,似乎不是session_start() connection.php中的session_start()会失败。

在致电header()之前,您不应该向浏览器输出任何内容,因此在这种情况下,您应该将include 'connection.php'; header('Access-Control-Allow-Origin : *'); 电话移至包含的下方:

{{1}}

您可以验证这是服务器错误日志中的问题。

答案 1 :(得分:0)

您可能需要在ajax请求中设置header

如果你正在使用jQuery ajax方法,那么添加以下选项

xhrFields: {
    withCredentials: true
}

或者,如果您使用XMLHttpRequest对象发送ajax请求,那么它应该像belwo

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);
  

来自其他域的XmlHttpRequest响应无法设置cookie   除非withCredentials设置为true,否则为其自己的域的值   在发出请求之前,无论Access-Control-标头如何   值。