结合我之前的写的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,里面会有对应的协议类型,协议所需要的字段,统一方法去处理这个编码的过程,这块后期也是要统一拿出来的,因为需要做数据的加密处理,如果你持续关注,后面都会有所涉及