![[cocos2dx]网络请求httpClient,第1张 [cocos2dx]网络请求httpClient,第1张](/aiimages/%5Bcocos2dx%5D%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82httpClient.png)
#include "network/httpClIEnt.h"using namespace cocos2d::network;httpRequest 实例 我们将使用httpRequest无参数的构造函数,它为大多数情况提供了一个很好的默认设置,所以我们使用它。
httpRequest* request = new httpRequest();设置连接方法的类型和待连接的地址 由http规范定义的各种方法对应各种不同的httpRequest类。 我们将使用Get方法,这是一个简单的方法,它只是简单地取得一个URL,获取URL指向的文档。
request->setRequestType(httpRequest::Type::GET);request->setUrl("http://www.httpbin.org/get"); 设置回调 无论服务器返回怎样的状态,响应主体response body总是可读的,这至关重要。 request->setResponseCallback(CC_CALLBACK_2(HelloWorld::onhttpComplete,this));在onhttpComplete里读取响应数据:
std::vector<char> *buffer = response->getResponseData();//Get the request data pointer back添加请求到httpClIEnt任务队列
cocos2d::network::httpClIEnt::getInstance()->send(request);释放连接 这是一个可以让整个流程变得完整的关键步骤,我们必须告诉httpClIEnt,我们已经完成了连接,并且它现在可以重用。如果不这样做的话,httpClIEnt将无限期地等待一个连接释放,以便它可以重用。 要释放连接,使用:
request->release();处理响应 现在,我们已经完成了与httpClIEnt的交互,可以集中精力做我们需要处理的数据。在这个例子中,我们仅仅将它在控制台上输出。
// dump datastd::vector *buffer = response->getResponseData();printf("http Test,dump data: ");for (unsigned int i = 0; i < buffer->size(); i++){ printf("%c",(*buffer)[i]);}printf("\n"); 如果你需要把response作为一个流来读取它里面的信息,上面的步骤将会同如何解析这个连接结合,当你处理完所有的数据后,关闭输入流,并释放该连接。 GET请求示例 下面是一个通过httpClIEnt的http GET请求的例子。 httpRequest* request = new httpRequest(); request->setUrl("http://www.baIDu.com"); request->setRequestType(httpRequest::Type::GET); request->setResponseCallback(CC_CALLBACK_2(HelloWorld::onhttpRequestCompleted,this)); request->setTag("GET test"); cocos2d::network::httpClIEnt::getInstance()->send(request); request->release(); POST请求示例 下面将发送一个POST请求到URL“ http://httpbin.org/post”。 httpRequest* request = new httpRequest(); request->setUrl("http://httpbin.org/post"); request->setRequestType(httpRequest::Type::POST); request->setResponseCallback(CC_CALLBACK_2(HelloWorld::onhttpRequestCompleted,this)); // write the post data const char* postData = "visitor=cocos2d&TestSuite=Extensions Test/NetworkTest"; request->setRequestData(postData,strlen(postData)); request->setTag("POST test"); cocos2d::network::httpClIEnt::getInstance()->send(request); request->release(); 处理网络回调函数 voID HelloWorld::onhttpRequestCompleted(httpClIEnt *sender,httpResponse *response){ if (!response) { return; } // You can get original request type from: response->request->reqType if (0 != strlen(response->gethttpRequest()->getTag())) { log("%s completed",response->gethttpRequest()->getTag()); } int statusCode = response->getResponseCode(); char statusstring[64] = {}; sprintf(statusstring,"http Status Code: %d,tag = %s",statusCode,response->gethttpRequest()->getTag()); _labelStatusCode->setString(statusstring); log("response code: %d",statusCode); if (!response->isSucceed()) { log("response Failed"); log("error buffer: %s",response->getErrorBuffer()); return; } // dump data std::vector<char> *buffer = response->getResponseData(); printf("http Test,dump data: "); for (unsigned int i = 0; i < buffer->size(); i++) { printf("%c",(*buffer)[i]); } printf("\n");} AndroID 需要注意的是,如果你是 Android 环境,不要忘了在您的应用程序的Manifest 中增加相应的权限: <uses-permission androID:name=”androID.permission.INTERNET” /> 详细代码可参照..\tests\Cpp\TestCpp\Classes\ExtensionsTest\NetworkTest\httpClIEntTest.cpp httpManager架构 httpManager.h文件 #pragma once#include "cocos2d.h"#include "network/httpClIEnt.h"//#include "Core/FV/FvSingleton.h"USING_NS_CC;using namespace network;using namespace std;class httpManagerDelegate{public: virtual voID onhttpManagerRequestCompleted(httpClIEnt* sender,httpResponse* response) = 0;};class httpManager //: public FvSingleton<httpManager>{public: httpManager(voID); ~httpManager(voID); CC_SYNTHESIZE(httpManagerDelegate*,_httpManagerDelegate,httpDelegate); //等价于 httpManagerDelegate* gethttpDelegate(){return _httpManagerDelegate;}; //等价于 voID sethttpDelegate(httpManagerDelegate* delegate){_httpManagerDelegate = delegate;}; //static httpManager* getInstance(); voID sendGetRequest(string url,string requestTag); voID sendPostRequest(string url,string requestTag);private: voID onhttpRequestCompleted(httpClIEnt* sender,httpResponse* response); //static httpManager* mhttpManager;}; httpManager.cpp文件 #include "httpManager.h"//FV_SINGLetoN_STORAGE(httpManager);//httpManager* httpManager::mhttpManager = nullptr;httpManager::httpManager(voID){ _httpManagerDelegate = nullptr; httpClIEnt::getInstance()->setTimeoutForConnect(5);}httpManager::~httpManager(voID){}httpManager* httpManager::getInstance(){ if (mhttpManager == nullptr) { mhttpManager = new httpManager(); } return mhttpManager;}voID httpManager::sendGetRequest(string url,string requestTag){ httpRequest* request = new (std::nothrow) httpRequest(); request->setRequestType(httpRequest::Type::GET); request->setUrl(url.c_str()); request->setResponseCallback(CC_CALLBACK_2(httpManager::onhttpRequestCompleted,this)); request->setTag(requestTag.c_str()); httpClIEnt::getInstance()->send(request); request->release();}voID httpManager::sendPostRequest(string url,string requestTag){ httpRequest* request = new (std::nothrow) httpRequest(); request->setRequestType(httpRequest::Type::POST); request->setUrl(url.c_str()); request->setResponseCallback(CC_CALLBACK_2(httpManager::onhttpRequestCompleted,this)); request->setTag(requestTag.c_str()); request->setRequestData("",0); httpClIEnt::getInstance()->send(request); request->release();}voID httpManager::onhttpRequestCompleted(httpClIEnt* sender,httpResponse* response){ if (!response) { return; } const char* tag = response->gethttpRequest()->getTag(); if (0 != strlen(tag)) { log("%s completed",tag); } log("http Status Code::%ld,response->getResponseCode(),tag); //if (!response->isSucceed()) //{ // log("response Failed"); // log("error buffer:%s",response->getErrorBuffer()); // mMapCallBack.erase(tag); // return; //} if (_httpManagerDelegate) { _httpManagerDelegate->onhttpManagerRequestCompleted(sender,response); }} BLLhttpTest.h文件 #pragma once#include "Core/FV/FvSingleton.h"#include "Core/Network/httpManager.h"using namespace std;class BLLhttpTest : public httpManagerDelegate//,public FvSingleton<BLLhttpTest>{public: BLLhttpTest(voID); ~BLLhttpTest(voID); static BLLhttpTest* getInstance(); typedef std::function<voID(string responseData,const char* tag)> onResponseCallBack; voID sendGetRequest(string url,string requestTag,onResponseCallBack cb); voID sendPostRequest(string url,onResponseCallBack cb); virtual voID onhttpManagerRequestCompleted(httpClIEnt* sender,httpResponse* response);private: voID onhttpRequestCompletedDataHandle(string data,string tag); std::map<string,onResponseCallBack> mMapCallBack; static BLLhttpTest* mBLLhttpTest; httpManager* mhttpManager;}; BLLhttpTest.cpp文件
#include "BLLhttpTest.h"//FV_SINGLetoN_STORAGE(BLLhttpTest);BLLhttpTest* BLLhttpTest::mBLLhttpTest = nullptr;BLLhttpTest::BLLhttpTest(voID){ mhttpManager = new httpManager(); mhttpManager->sethttpDelegate(this);}BLLhttpTest::~BLLhttpTest(voID){}BLLhttpTest* BLLhttpTest::getInstance(){ if (!mBLLhttpTest) { mBLLhttpTest = new BLLhttptest(); } return mBLLhttpTest;}voID BLLhttpTest::sendGetRequest(string url,onResponseCallBack cb){ mMapCallBack[requestTag] = cb; mhttpManager->sendGetRequest(url,requestTag);}voID BLLhttpTest::sendPostRequest(string url,onResponseCallBack cb){ mMapCallBack[requestTag] = cb; mhttpManager->sendPostRequest(url,requestTag);}voID BLLhttpTest::onhttpManagerRequestCompleted(httpClIEnt* sender,httpResponse* response){ const char* tag = response->gethttpRequest()->getTag(); if (!response->isSucceed()) { log("response Failed"); log("error buffer:%s",response->getErrorBuffer()); mMapCallBack.erase(tag); return; } std::vector<char> *buffer = response->getResponseData(); string temp = ""; for (unsigned int i = 0; i < buffer->size(); i++) { temp +=(*buffer)[i]; } log("http Test,dump data:%s\n",temp.c_str()); if (mMapCallBack[tag]) { onhttpRequestCompletedDataHandle(temp,tag); mMapCallBack[tag](temp,tag); mMapCallBack.erase(tag); }}voID BLLhttpTest::onhttpRequestCompletedDataHandle(string data,string tag){} 几乎所有的架构中,涉及到回调函数,都会把回调函数封装成一个纯虚类,子类继承这个纯虚类并实现纯虚函数。然后在子类的构造函数中,将自己给设置成代理。次httpManager架构运用了Bridge桥接设计模式 总结
以上是内存溢出为你收集整理的[cocos2dx]网络请求httpClient全部内容,希望文章能够帮你解决[cocos2dx]网络请求httpClient所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)