集成cocos2dx中的CHttpClient到lua中

不知道爲什麼cocos2dx中似乎沒有把extensions/network裏的HttpClient集成進去,自己試了一下DIY也不是很難,現總結如下

首先CCHttpRequest中的setResponseCallback需要處理一下,因爲這裏我們需要的是一個lua的回調而並非c++的,

處理方案參考CCSchduler中的scheduleScriptFunc,採用lua的handler來解決

最終代碼如下:

pkg文件

class CCHttpClient : CCObject
{
    static CCHttpClient *getInstance();
    
    static void destroyInstance();
        
    void send(CCHttpRequest* request);
  
    void setTimeoutForConnect(int value);
    
    int getTimeoutForConnect();
    
    void setTimeoutForRead(int value);
    
    int getTimeoutForRead();
};


class CCHttpRequest : CCObject
{
    typedef enum
    {
        kHttpGet,
        kHttpPost,
        kHttpPut,
        kHttpDelete,
        kHttpUnkown,
    } HttpRequestType;
    
    
    void setRequestType(HttpRequestType type);


    HttpRequestType getRequestType();
    
    void setUrl(const char* url);


    const char* getUrl();
    
    void setRequestData(const char* buffer, unsigned int len);


    char* getRequestData();


    int getRequestDataSize();
    
    void setTag(const char* tag);


    const char* getTag();
};


class CCLuaHttpRequest: CCHttpRequest
{
	void setResponseScriptCallback(LUA_FUNCTION aHandler);


	static CCLuaHttpRequest* create();


	static bool mkdirs(std::string aDir);
};

LuaHttpRequest.h

#ifndef CCLUAHTTPREQUEST_H_
#define CCLUAHTTPREQUEST_H_

#include <network/HttpClient.h>

USING_NS_CC;
USING_NS_CC_EXT;

class CCLuaHttpRequest: public CCHttpRequest
{
	public:

		CCLuaHttpRequest();

		virtual ~CCLuaHttpRequest();

	public:

		static CCLuaHttpRequest* create();

		static bool mkdirs(std::string aDir);

		/**
		 * 設置一個用於回調的lua函數
		 */
		void setResponseScriptCallback(unsigned int aHandler);

	private:

		/**
		 * 默認的用於c++的回調,由這裏統一處理到lua的回調
		 */
		void responseScriptCallback(CCHttpClient* apClient, CCHttpResponse* apResponse);

	private:

		/**
		 * 當前保存的handler
		 */
		unsigned int mHandler;
};

#endif /* CCLUAHTTPREQUEST_H_ */

LuaHttpRequest.cpp

#include "LuaHttpRequest.h"
#include "CCLuaEngine.h"
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>

CCLuaHttpRequest::CCLuaHttpRequest() :
		mHandler(0)
{
	
}

CCLuaHttpRequest::~CCLuaHttpRequest()
{
}

CCLuaHttpRequest* CCLuaHttpRequest::create()
{
	return new CCLuaHttpRequest;
}

bool CCLuaHttpRequest::mkdirs(std::string aDir)
{
	if (aDir.size() == 0)
	{
		return true;
	}

	CCLOG("creating dir:%s", aDir.c_str());
	bool isFirst = aDir[0] == '/';
	bool isLast = false;
	for (unsigned int i = 1; i < aDir.size(); i++)
	{
		if (aDir[i] == '/')
		{
			if (isLast)
			{
				continue;
			}
			isLast = true;

			if (isFirst)
			{
				isFirst = false;
				continue;
			}

			std::string path = aDir.substr(0, i);
			if (CCFileUtils::sharedFileUtils()->isFileExist(path.c_str()))
			{
				CCLOG("path:%s exist", path.c_str());
				continue;
			}
			int ret = mkdir(path.c_str(), 0700);
			if (ret && errno != EEXIST)
			{
				CCLOG("mkdir:%s failed", path.c_str());
				return false;
			}
			else
			{
				CCLOG("path:%s created", path.c_str());
			}
		}
		else
		{
			isLast = false;
		}
	}
	return true;
}

void CCLuaHttpRequest::setResponseScriptCallback(unsigned int aHandler)
{
	mHandler = aHandler;
	setResponseCallback(this, httpresponse_selector(CCLuaHttpRequest::responseScriptCallback));
}

void CCLuaHttpRequest::responseScriptCallback(CCHttpClient* apClient, CCHttpResponse* apResponse)
{
	CCLuaEngine* pEngine =
			dynamic_cast<CCLuaEngine*>(CCScriptEngineManager::sharedManager()->getScriptEngine());
	CCLuaStack* pStack = pEngine->getLuaStack();
	bool isSucceed = apResponse->isSucceed();
	int status = apResponse->getResponseCode();
	const char* errorBuffer = apResponse->getErrorBuffer();
	std::vector<char>* headerBuffer = apResponse->getResponseHeader();
	std::vector<char>* bodyBuffer = apResponse->getResponseData();
	std::string header(headerBuffer->begin(), headerBuffer->end());
	std::string body(bodyBuffer->begin(), bodyBuffer->end());
	pStack->pushCCObject(apResponse->getHttpRequest(), "CCHttpRequest");
	pStack->pushBoolean(isSucceed); //是否成功
	pStack->pushString(body.c_str(), body.size()); //body
	pStack->pushString(header.c_str()); //header
	pStack->pushInt(status); //狀態碼
	pStack->pushString(errorBuffer); //錯誤描述
	pStack->executeFunctionByHandler(mHandler, 6);
	pStack->clean();
}

注意使用tolua++的時候需要注意一下-L basic.lua

最終使用的lua代碼如下

local request = CCLuaHttpRequest:create()
        request:setUrl(url)
        request:setTag(tag)
        request:setRequestType(CCHttpRequest.kHttpGet)
        request:setResponseScriptCallback(dlImageCallback)
        CCHttpClient:getInstance():send(request)
        request:release()


發佈了217 篇原創文章 · 獲贊 8 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章