网络通信之http
CrossApp为我们封装了http的网络框架,其文件在CrossApp引擎包的\extensions\network文件下的 HttpClient、HttpRequest 、HttpResponse。
进行一次http交互,需要涉及的有三个类:
HttpRequest 用来描述一个请求。
HttpResponse 用来描述对应请求的响应。
HttpClient是一个单例模式的类,它的职责就是负责将收到的HttpRequest对象push到发送队列中,并发送一个信号量驱动工作线程工作,工作线程再将收到的数据封装成一个HttpResponse对象push接收队列,并启用调度来派送数据。
引用头文件:
#include "CrossAppExt.h"
请求
/**
编译到Android平台之后注意添加联网权限
**/
//创建request对象,这里new出来的对象不能使用autorelease(),原因后述
CAHttpRequest* request = new CAHttpRequest();
//设置URL
request->setUrl("www.9maio.com");
//设置请求类型kHttpGet、kHttpPost、KHttpPostFile、kHttpPut、kHttpDelete、kHttpUnkown
request->setRequestType(CAHttpRequest::kHttpGet);
//这是回调对象和回调函数
request->setResponseCallback(this, httpresponse_selector(FirstViewController::requestresult));
//使用CCHttpClient共享实例来发送request
CAHttpClient::getInstance()->send(request);
//调用release()
request->release();
接收
void FirstViewController::requestresult(CAHttpClient* clinet, CAHttpResponse* response)
{
if (!response->isSucceed())
{
return;
}
//获取返回代码,比如200、404等
int statusCode = response->getResponseCode();
if (statusCode == 200)
{
std::string responseRes = "";
std::vector<char> *buffer = response->getResponseData();
for (unsigned int i = 0; i < buffer->size(); i++)
{
responseRes += (*buffer)[i];
}
//查找字符“官方特约”
string::size_type idx = responseRes.find(UTF8("官方特约"));
if (idx == -1)
{
//为找到字符
CCLog(" Not Found");
return;
}
string temp = responseRes.substr(idx, 30);
string num = temp.substr(temp.find(UTF8(":")) + 3, temp.find("<") - temp.find(UTF8(":")) - 3);
CCLog("temp:%s",temp.c_str());
}
else
{
//打印返回代码
CCLog("statusCode:%d", statusCode);
}
}