游戏开发(七) 之 quick-cocos2dx-lua 封装 network.createHTTPRequest

结合我之前的写的cocos2dx中protobuf的使用(游戏开发六),加上这篇文章,可以完美的解决和服务器在http通讯上的所有问题.

这里直接封装 quick 提供的 network.createHTTPRequest

先看代码

XXHttp = {}

--状态枚举
XXHttp.Failed 	= "Failed"  --链接失败
XXHttp.Error 	= "Error"	--服务器返回错误码
XXHttp.Success 	= "Success"	--返回数据

function XXHttp:Post( data , callList ) --arg:callList  {枚举key,callback}
	local request = network.createHTTPRequest(function(event) XXHttp:onRequestCallback(event) end, "http://192.168.3.25:12333/test", "POST")
	request:setPOSTData( data )
	request.callList = callList;
	request:start()
end

function XXHttp:onRequestCallback(event)
	if event.name == "progress" then return end --进度条先无视
	local ok = (event.name == "completed")
    local request = event.request
	local callList = request.callList
	if callList == nil then callList = {} end
	
	local function requestFailed( _type )
		if callList[XXHttp.Failed] ~= nil then
			callList[XXHttp.Failed]()
			return
		end
		XXLogLine("request is failed! no callback " .. _type)
	end
	-- 请求失败
    if not ok then  
		requestFailed("-1")
        return
    end
	-- 请求结束 没有返回200
    local code = request:getResponseStatusCode() 
    if code ~= 200 then 
		requestFailed(tostring(code))
        return
    end
    -- 请求成功
    local recvData = request:getResponseString()
	local dataLength = request:getResponseDataLength()
	-- 开始解析
	local baseData = base_pb.base_message()
	baseData:ParseFromString(recvData)
	-- 服务器返回错误码
	if baseData._ecode ~= 0 then
		if callList[XXHttp.Error] ~= nil then
			callList[XXHttp.Error](baseData._ecode)
		end
		return
	end
	-- 返回数据
	if callList[XXHttp.Success] ~= nil then
		callList[XXHttp.Success](baseData._type,baseData._data)
	else
		XXLogLine("Success but no callback" .. baseData._type )
	end
end

再看使用的代码:  

其中发送的数据函数 ( self:encodeProto() ) 可以查看我上篇文章

local callList = {}
callList[XXHttp.Failed ] = function() 
	print("failed") 
end

callList[XXHttp.Success] = function(_type,_data)
	print("recv type:" .. _type) 
end

callList[XXHttp.Error  ] = function(errorCode) 
	print("errorCode:" .. errorCode) 
end

XXHttp:Post( self:encodeProto() , callList )

我分别模拟了对应XXHttp中的3种状态的情况,对应调用上面的 callList 函数列表

1.服务器没有开启,或无法访问目标服务器

2.服务器返回错误码

3.服务器正常返回数据

打印如下:

这里我就不做解析了,具体内容也可翻阅上篇文章.

这里说下我的思路:

  • 这只是个封装的思路,尽可能的简化使用者的键入代码
  • callList 可以根据情况来选择调用方是否需要回调
  • 打个比方: 我只是想发送出去个请求,不在乎是否返回,那调用起来就一句话 XXHttp:Post( data, callList ) ,比如用户行为统计

待完善内容:

XXHttp.Failed

这里其实就是网络出现问题,不是你网络不好,就是你服务器崩溃了, 这个后面可以完善成:做一个缓存,在收到Failed的时候,判断是否需要再次发送这个request

XXHttp.Error

后面可以完善成所有返回Error的协议,统一处理.例如做个tips弹出类,根据不同的错误代码,弹出不同的文本提示,如果需要接收返回也可以不弹提示,调用返回函数

因为目前我还没有开始写逻辑,所以这里的url是写死的,接口参数也没提供参数,这里只是基础的封装,后面会根据实际使用情况来做处理

对于后面的使用,我目前的想法是:

把XXHttp:Post 第一个参数改成一个table,里面会有对应的协议类型,协议所需要的字段,统一方法去处理这个编码的过程,这块后期也是要统一拿出来的,因为需要做数据的加密处理,如果你持续关注,后面都会有所涉及

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值