PhoneGap应用程序的XMLHttpRequest POST数据丢失

时间:2014-01-17 17:56:51

标签: javascript android post cordova

我正在将一个ajaxed,针对移动设备优化的网站移植到PhoneGap,但是在向服务器发送任何POST方面都没有成功。根据我的阅读,xhreq POSTS应该可以在PhoneGap中使用。

具体细节:我使用最新的Cordova 3.3.1-0.1.2,最新的Android SDK以及Verizon更新到Android 4.3的Galaxy S3来定位Android平台。通过wifi连接到我的本地服务器。在每次尝试中,POST作为GET到达服务器,没有发布数据(使用tcpdump验证数据包进行验证)。移动优化的网站可以在同一部手机上的浏览器中正常工作,也可以通过wifi进行。

我通过创建一个全新的Phonegap项目来隔离失败案例,仅仅是:

$ cordova create Hello
$ cd Hello
$ cordova platform add android

然后在index.js中,在onDeviceReady处理程序的末尾,添加一个我首先在一个简单的浏览器页面中测试的片段(这里替换了域名):

// TEST POST CAPABILITY
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
  if (req.readyState==4 && (req.status==200 || req.status==0)) {
    console.log("POST Response: " + req.responseText);
  }
};
var t = new Date().getTime();  // Just to foil any caching
req.open("POST", "http://mydomain.com/services/rpc?t=" + t, true);  // async
req.setRequestHeader('Content-type','application/text; charset=utf-8');
var postContent = JSON.stringify({id:t, method:"misc.log", params:[{log:"POST Test"}]});
req.send(postContent);

然后在电话上运行:

$ cordova run android

它失败了,就像更全面的应用程序,作为GET到达服务器,没有发布数据。我验证了几个配置项默认值,以确保它们符合要求:

在config.xml中:

<access origin="*" />

在AndroidManifest.xml中:

<uses-permission android:name="android.permission.INTERNET" />

关于可能出现什么问题的想法或其他要注意的事项?

感谢。

2 个答案:

答案 0 :(得分:0)

您的内容类型应设置为

"application/json"

JSON.stringify()创建JSON内容。

接下来,您能告诉我们您的服务器进程如何确定请求类型。你能发布相关的代码吗?

我首先要调整内容类型值。看看是否有所作为。

希望有所帮助。

答案 1 :(得分:0)

问题是ip转发问题,而不是我最初怀疑的问题(转发到端口80并从端口80转移到我的本地服务器端口8080,我已经使用了多年以方便不允许将8080添加到浏览器URL中。

就是这样:

在“mydomain.com”的MX记录中,我有www.mydomain.com指向我服务器的IP地址,但是根mydomain.com(我在XMLHttpRequest的url中使用的主机地址),重定向到www.mydomain.com。

这在普通的浏览器会话中工作,就像你输入mydomain.com一样,它只是去www.mydomain.com,然后从那里运行 - 它将使用xhreq中的所有相对路径。

但是,在PhoneGap中,要求指定完整路径,POST不会通过重定向。它还导致图像加载行为迟缓以及许多负载后出现一些奇怪的通信挂断 - 我只是没有意识到问题具有相同的根本原因(而是我对WebView性能感到担忧)。

好消息是POST现在运行正常,WebView似乎可以快速满足我的需求。

总结解决方案:确保传递给XMLHttpRequest(在PhoneGap中需要)的完全限定网址中的子域(或缺少)被映射到MX记录中的IP地址(A记录),而不是重定向为您的域名。