今天的主题是关于cocos2dx lua实现短链接网络请求,使用Http实现基本的服务器网络数据获取,关于长链接(socket后续文件或者遇到需要的时候回特别实现与处理)
关于Http这里就不多做介绍了,不过,作为一个程序员,网络请求是开发中最多也是最重要的一环节,这里比较建议,搞懂http的整个请求流程!
在有了基本的Lua知识和cocos2dx lua基本的了解和学习之后,我有了一个初步的cocos2dx lua开发常识,然后就开始在上面实现基本的界面,并根据界面操作请求和响应数据!
入口场景
在main中初始化场景中必要的UI.
创建一个背景图片和一个按钮,实现点击按钮跳转到另外一个场景,进行网络请求和数据获取
--- @class MainScene
local MainScene = class("MainScene",cc.load("mvc").ViewBase)
---onEnter
function MainScene:onEnter()
print("onEnter")
end
---createStaticButton 通用创建按钮方法
---@param node table
---@param imageName table
---@param x table
---@param y table
---@param callBack table
local function createStaticButton(node, imageName, x, y, callBack)
local btn = ccui.Button:create(imageName, imageName)
btn:move(x, y)
btn:addClickEventListener(callBack)
btn:addTo(node)
end
--
-----onCreate
function MainScene:onCreate()
-- 初始化背景
display.newSprite("HelloWorld.png")
:move(display.center)
:addTo(self)
-- 初始化按钮
createStaticButton(self, "button_start.png", display.cx, display.cy-150, function ()
self:getApp():enterScene("ApiRequest")
end)
end
return MainScene
网络应用场景(ApiRequest)
然后开始处理跳转之后的ApiRequest,和相关请求逻辑,这里主要是使用我们封装好的CocosRequest实现基本上的请求逻辑,然后拿到数据之后我们就可以根据实际UI和具体业务逻辑做处理
注意
测试的时候,将local url = "https://xxxx?cmd=501001&uid=628941&novelid=3782"中的值换成自己的地址就可以
require "json"
local CocosRequest = require "app.CocosRequest"
--- @class ApiRequest
local ApiRequest = class("ApiRequest", cc.load("mvc").ViewBase)
----local MainScene = class("MainScene", function() return display.newScene("MainScene") end)
---onEnter
function ApiRequest:onEnter()
print("onEnter")
end
-----onCreate
function ApiRequest:onCreate()
----------------------- 创建自定义事件 start
local function eventCustomListener1(event)
local str = "response: "..event._usedata
--labelStatusCode:setString(str)
-- 如果返回的是 json 数据,这里解析
local data = json.decode(event._usedata)
table.foreach(data,
function(key, var)
print("-----"..key)
table.foreach(var,
function(a, b)
print(a.."-"..b)
end)
end)
end
local listener1 = cc.EventListenerCustom:create("customEvent1",eventCustomListener1)
cc.Director:getInstance():setNotificationNode(cc.Node:create())
local eventDispatcher = cc.Director:getInstance():getNotificationNode():getEventDispatcher()
eventDispatcher:addEventListenerWithFixedPriority(listener1, 6)
-- 将事件分配器赋值到CocosRequest.eventDispatcher
-- 用来在http请求返回的回调函数中使用,因为回调函数是在异步线程中执行,必须用自定义事件更新ui线程数据
local tmpHttp = CocosRequest:getInstance()
tmpHttp.eventDispatcher = eventDispatcher
----------------------- 创建自定义事件 end
local tmp = CocosRequest:getInstance()
local function callback(xhr)
local event = cc.EventCustom:new("customEvent1")
event._usedata = xhr.response
eventDispatcher:dispatchEvent(event)
print("post callback code = "..xhr.statusText)
end
local type = tmp.POST
local url = "https://xxxx?cmd=501001&uid=628941&novelid=3782"
local dataPost = {}
dataPost.data = "hello"
dataPost.aaa = "world"
dataPost.bbb = "yang"
tmp:send(type, url, dataPost, callback)
end
return ApiRequest
网络请求封装(CocosRequest)
最后才是我们的重头戏,CocosRequest是直接使用cocos2dx lua提供的XMLHttpRequest实现,其实就是做了一套逻辑,具体细节可以根据项目调整(此处已经测试通过,可直接拷贝使用)
require "json"
CocosRequest = {}
CocosRequest.__index = CocosRequest
CocosRequest.instance = nil
CocosRequest.callback = nil
CocosRequest.POST = "POST"
CocosRequest.GET = "GET"
function CocosRequest:new()
local self = {}
setmetatable(self,CocosRequest)
return self
end
function CocosRequest:getInstance()
if nil == self.instance then
self.instance = self:new()
end
return self.instance
end
-- 数据转换,将请求数据由 table 型转换成 string,参数:table
function CocosRequest:dataParse(data)
if "table" ~= type(data) then
print("data is not a table")
return nil
end