cocos2d-x做游戏,避免不了和服务器网络的交互,这里分享一下cocos2d-x 和WebServer数据交互的例子。
请求的发送通过 类 CCHttpRequest 发送。 (cocos2d-x 版本为2.0~2.0.4)
CCHttpRequest* request = new CCHttpRequest();
request->setUrl("这里是你的WebServer地址");
request->setRequestType(CCHttpRequest::kHttpPost);
std::vector<std::string> headers;
headers.push_back("Content-Type: application/soap+xml; charset=utf-8"); //WebServer当中数据文件头类型说明
request->setHeaders(headers);
request->setResponseCallback(this, callfuncND_selector(HelloWorld::onHttpRequestCompleted)); //设置请求完成后的回调函数 onHttpRequestCompleted 失败成功都会进入
// write the post data
const char* postData = "这里是XML格式的请求报文.";
request->setRequestData(postData, strlen(postData));
request->setTag("POST test2"); //给请求指针设置标记
CCHttpClient::getInstance()->send(request);
request->release();
在请求数据完成后需要对返回的数据进行处理。类 CCSAXParser 就是处理解析返回的XML报文,在当前类头文件中继承 cocos2d::CCSAXDelegator 并且复写父类当中的解析回调函数进行数据获取:
virtual void startElement(void *ctx, const char *name, const char **atts);
virtual void endElement(void *ctx, const char *name);
virtual void textHandler(void *ctx, const char *s, int len);
void HelloWorld::onHttpRequestCompleted(cocos2d::CCNode *sender, void *data)
{
CCHttpResponse *response = (CCHttpResponse*)data;
if (!response)
{
return;
}
// You can get original request type from: response->request->reqType
if (0 != strlen(response->getHttpRequest()->getTag()))
{
CCLog("%s completed", response->getHttpRequest()->getTag());
}
int statusCode = response->getResponseCode();
char statusString[64] = {};
sprintf(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag());
//m_labelStatusCode->setString(statusString);
CCLog("response code: %d", statusCode);
if (!response->isSucceed())//判断返回的状态码,是否存在连接错误.
{
CCLog("response failed");
CCLog("error buffer: %s", response->getErrorBuffer());
return;
}
// dump data
std::vector<char> *buffer = response->getResponseData();
std::string strResult = "";
//printf("Http Test, dump data: ");
for (unsigned int i = 0; i < buffer->size(); i++) //获取返回的XML内容
{
printf("%c", (*buffer)[i]);
strResult+=(*buffer)[i];
}
//printf("\n");
CCLog("%s",strResult.c_str());
//开始解析XML内容
CCSAXParser par;
if(!par.init("UTF-8"))
{
CCLog("-----请使用utf-8格式!");
return ;
}
par.setDelegator(this);
par.parse(strResult.c_str(), strResult.size());
}
完整DEMO工程下载地址:点击打开链接