Quick2.2.6发送POST网络请求时服务端收不到Json对象形式的POST数据包

我现在有个Cocos2d Quick项目从2.2.3升级到2.2.6,发现在Lua中用network.createHTTPRequest(callback, url, method)异步发送POST数据时,当发出的数据包是Json对象时会有问题,直到现在还不能解决:

假如我现在有个用network.createHTTPRequest(callback, url, method)创建的request对象用来发送网络请求,如果发送的POST数据包是名值对:

local httpRequest = network.createHTTPRequest(callback, myUrl, “POST”);
httpRequest:addPOSTValue(“firstName”, “Mike”);
httpRequest:start();

一切正常,回调函数中能接收到返回的数据。但是如果发送的POST数据包是Josn对象时(在Java层应该是用流的形式发送给服务器的):

local httpRequest = network.createHTTPRequest(callback, myUrl, “POST”);
httpRequest:addRequestHeader(“Content-Type:text/json”);
httpRequest:setPOSTData(myRequestData);
httpRequest:start();

这样的话服务端能接收到客户端的数据请求,但是发现其request数据包是null,也就是说收不到myRequestData,这样服务器就报错了。

我跟踪了Quick引擎中与此相关的QuickHTTPInterface.java类,发现当POST数据包是名值对时,QuickHTTPInterface对象执行的是postContent(HttpURLConnection http, String name, String value, boolean bNeedConnectSym)方法,而当POST数据包是Json对象时,执行的是postContentByteArray(HttpURLConnection http, byte] byteArray)方法。所以我怀疑这个方法并没有把Json数据发送给服务器。
我的项目在2.2.3的时候是好的,这个问题是把引擎升级到2.2.6后出现的。
请各路大神诊断诊断,这种情况到底是什么原因造成的,该怎么解决?

这是一个坑子,一路追踪下去,发现问题是这样的:
在Lua中执行
httpRequest:addRequestHeader(“Content-Type:text/json”);
时,QuickHTTPInterface.java中的addRequestHeader(HttpURLConnection,String,String,boolean)方法并没有被调用,这样的话发送到服务器的请求中数据没有头标记,所以服务器就认为请求数据包为null。
解决办法:在QuickHTTPInterface.java的createURLConnect(String)方法中硬编码直接把头标记加上:
urlConnection.setRequestProperty(“Content-Type”,“text/html,application/xhtml+xml,application/xml,application/json”);

当然,这是临时的解决办法。希望官方在C++中把这个问题解决掉。

关于Quick-cocos2d 2.2.6的通信,除了上面那个问题外,我发现还有一个相当麻烦的问题:

在向服务端发起通信请求(比如登录)时,服务端在返回的数据包的Header里会包含一个set-cookie,在这里记录着服务器发给客户端的playerSession,这样每次客户端向服务端发送请求时会重新把这个playerSession写在Header里发给服务器。按正常流程,客户端在收到回包时应该将set-cookie中的值写在cookie中,在客户端发起请求时再从cookie中读取这个值,但是现在我发现尽管服务端回包中有set-cookie值,但是每次客户端发送请求时,并没有把这个值发回给服务器。作为一种应急措施,我只能在发送请求前用http.setRequestProperty(“Cookie”, playerSession)的方法手动设置。

我看了一些引擎中cpp代码,似乎通信的cookie应该是写在一个cookie.txt文件中的。但是当我在Lua中尝试读取这个文件时:
local cookiePath = CCFileUtils:sharedFileUtils():getWritablePath() … “cookie.txt”;
local file =io.readfile(cookiePath);
引擎报了错误:
Get data from file(/data/data/com.aspectgaming.mobilelobby/files/cookie.txt) failed!
是不是这意味着coocs2d引擎在接收到服务端回包时,并没有执行记录cookie的程序?

这种情况只在Android里有,ios是好的。

我看了框架中的CCHTTPRequestAndroid.cpp代码,读取cookie和设置request data的Header的工作都是在CCHTTPRequest::start(void)方法中进行的,所以我怀疑这里的代码并没有真正调用到Java中的代码(我在QuickHTTPInterface.java的addRequestHeader(http,strkey,strValue,bNeedBoundary)方法中打了断点,证明这个方法从来没有被执行过)。希望官方查一下到底是哪个环节断链了。

我编译运行时的NDK版本是android-ndk-r9d-64

我也碰到了这个坑 ,确实是c++代码写得有问题,里面添加head的函数,用“=”作分隔判断,而我们穿进去的head一般中间是“:”