[cocos2dx]网络请求httpClient

[cocos2dx]网络请求httpClient,第1张

概述HttpClient是HTTP客户端的接口。HttpClient封装了各种对象,处理cookies,身份认证,连接管理等。 概念 HttpClient的使用一般包含下面6个步骤: 创建 HttpRequest 的实例; 设置某种连接方法的类型(GET、POST等),这里通过setUrl传入待连接的地址; 设置响应回调函数,读取response; 添加请求到HttpClient任务队列; 释放连接。 httpClIEnt是http客户端的接口。httpClIEnt封装了各种对象,处理cookies,身份认证,连接管理等。 概念 httpClIEnt的使用一般包含下面6个步骤: 创建 httpRequest 的实例; 设置某种连接方法的类型(GET、POST等),这里通过setUrl传入待连接的地址; 设置响应回调函数,读取response; 添加请求到httpClIEnt任务队列; 释放连接。无论执行方法是否成功,都必须释放连接; 对得到后的内容进行处理。 如何使用 引入头文件和命名空间
#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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1083670.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存