Cocos2d-x 3.2 Lua示例 XMLHttpRequestTest(Http网络请求)

48 篇文章 0 订阅
33 篇文章 0 订阅

https://blog.csdn.net/wwj_748/article/details/38491393

Cocos2d-x 3.2 Lua示例 XMLHttpRequestTest(Http网络请求)


    本篇博客介绍Cocos2d-x 3.2Lua示例中的XMLHttpRequestTest,这里提供GET和POST两种http请求方式,返回数据类型有以下几种:
cc.XMLHTTPREQUEST_RESPONSE_STRING = 0  -- 返回字符串类型
cc.XMLHTTPREQUEST_RESPONSE_ARRAY_BUFFER = 1 -- 返回字节数组类型
cc.XMLHTTPREQUEST_RESPONSE_BLOB   = 2 -- 返回二进制大对象类型
cc.XMLHTTPREQUEST_RESPONSE_DOCUMENT = 3 -- 返回文档对象类型
cc.XMLHTTPREQUEST_RESPONSE_JSON = 4 -- 返回JSON数据类型


这些常量的定义可以到Cocos2dConstants.lua下找到。


示例代码:
[javascript]  view plain  copy
  1. --[[  
  2. =================  
  3. XMLHttpRequestTest.lua  
  4. http请求  
  5. =================  
  6. ]]--  
  7. require("json")  
  8.   
  9. local function XMLHttpRequestLayer()  
  10.   local layer = cc.Layer:create()-- 创建层  
  11.   local winSize = cc.Director:getInstance():getWinSize()-- 得到窗口大小  
  12.   local margin = 40-- 间距  
  13.   local space  = 35-- 宽度  
  14.   
  15.   local function init()  
  16.     local label = cc.Label:createWithTTF("XML Http Request Test", s_arialPath, 28)-- 使用ttf文字格式的标签  
  17.     label:setAnchorPoint(cc.p(0.5, 0.5))-- 设置锚点  
  18.     label:setPosition(cc.p(winSize.width / 2, winSize.height - margin))-- 设置显示位置,宽度为屏幕的中间,高度为屏幕高度减去间距  
  19.     layer:addChild(label, 0) -- 添加标签到层中  
  20.   
  21.     -- 显示返回码的标签  
  22.     local labelStatusCode = cc.Label:createWithTTF("HTTP Status Code", s_markerFeltFontPath, 20)  
  23.     labelStatusCode:setAnchorPoint(cc.p(0.5, 0.5))  
  24.     labelStatusCode:setPosition(cc.p(winSize.width / 2,  winSize.height - margin - 6 * space))  
  25.     layer:addChild(labelStatusCode)  
  26.   
  27.     local menuRequest = cc.Menu:create() -- 创建菜单  
  28.     menuRequest:setPosition(cc.p(0,0))  
  29.     layer:addChild(menuRequest) -- 添加菜单  
  30.   
  31.     --Get  
  32.     local function onMenuGetClicked()  
  33.       local xhr = cc.XMLHttpRequest:new() -- http请求  
  34.       xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_STRING -- 响应类型  
  35.       xhr:open("GET""http://httpbin.org/get") -- 打开链接  
  36.   
  37.       -- 状态改变时调用  
  38.       local function onReadyStateChange()  
  39.         -- 显示状态文本  
  40.         local statusString = "Http Status Code:"..xhr.statusText  
  41.         labelStatusCode:setString(statusString)  
  42.         print(xhr.response)  
  43.       end  
  44.   
  45.       -- 注册脚本回调方法  
  46.       xhr:registerScriptHandler(onReadyStateChange)  
  47.       xhr:send() -- 发送请求  
  48.   
  49.       labelStatusCode:setString("waiting...")  
  50.     end  
  51.   
  52.     -- 测试Get的标签  
  53.     local labelGet  = cc.Label:createWithTTF("Test Get", s_arialPath, 22)  
  54.     labelGet:setAnchorPoint(cc.p(0.5, 0.5))  
  55.     local itemGet  =  cc.MenuItemLabel:create(labelGet) -- 菜单标签  
  56.     itemGet:registerScriptTapHandler(onMenuGetClicked) -- 菜单点击事件  
  57.     itemGet:setPosition(cc.p(winSize.width / 2, winSize.height - margin - space))  
  58.     menuRequest:addChild(itemGet) -- 添加菜单项  
  59.   
  60.     --Post  
  61.     local function onMenuPostClicked()  
  62.       local xhr = cc.XMLHttpRequest:new() -- 新建一个XMLHttpRequest对象  
  63.       xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_STRING -- 相应类型为字符串  
  64.       xhr:open("POST""http://httpbin.org/post")-- post方式  
  65.       local function onReadyStateChange()  
  66.         labelStatusCode:setString("Http Status Code:"..xhr.statusText)  
  67.         print(xhr.response)  
  68.       end  
  69.       -- 注册脚本方法回调  
  70.       xhr:registerScriptHandler(onReadyStateChange)  
  71.       xhr:send()-- 发送  
  72.   
  73.       labelStatusCode:setString("waiting...")  
  74.     end  
  75.   
  76.     -- 测试Post的标签  
  77.     local labelPost = cc.Label:createWithTTF("Test Post", s_arialPath, 22)  
  78.     labelPost:setAnchorPoint(cc.p(0.5, 0.5)) -- 设置锚点  
  79.     local itemPost =  cc.MenuItemLabel:create(labelPost) -- 设置菜单项标签  
  80.     itemPost:registerScriptTapHandler(onMenuPostClicked) -- 注册菜单项点击回调方法  
  81.     itemPost:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 2 * space))  
  82.     menuRequest:addChild(itemPost)  
  83.   
  84.     --Post Binary  
  85.     local function onMenuPostBinaryClicked()  
  86.       local xhr = cc.XMLHttpRequest:new()-- 新建一个XMLHttpRequest对象  
  87.       xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_ARRAY_BUFFER --返回数据为字节流  
  88.       xhr:open("POST""http://httpbin.org/post") -- 打开Socket  
  89.   
  90.       -- 状态改变时调用  
  91.       local function onReadyStateChange()  
  92.         local response   = xhr.response -- 获得返回数据  
  93.         local size     = table.getn(response) -- 获得返回数据大小  
  94.         local strInfo = ""  
  95.   
  96.         for i = 1,size do  
  97.           if 0 == response[i] then  
  98.             strInfo = strInfo.."\'\\0\'"  
  99.           else  
  100.             strInfo = strInfo..string.char(response[i])  
  101.           end  
  102.         end  
  103.         labelStatusCode:setString("Http Status Code:"..xhr.statusText)  
  104.         print(strInfo)  
  105.       end  
  106.   
  107.       -- 注册脚本方法回调  
  108.       xhr:registerScriptHandler(onReadyStateChange)  
  109.       xhr:send()-- 发送  
  110.   
  111.       labelStatusCode:setString("waiting...")  
  112.     end  
  113.   
  114.     -- 测试使用Post请求方式发送字节流  
  115.     local labelPostBinary = cc.Label:createWithTTF("Test Post Binary", s_arialPath, 22)  
  116.     labelPostBinary:setAnchorPoint(cc.p(0.5, 0.5))  
  117.     local itemPostBinary = cc.MenuItemLabel:create(labelPostBinary)  
  118.     itemPostBinary:registerScriptTapHandler(onMenuPostBinaryClicked)  
  119.     itemPostBinary:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 3 * space))  
  120.     menuRequest:addChild(itemPostBinary)  
  121.   
  122.     --Post Json  
  123.     local function onMenuPostJsonClicked()  
  124.       local xhr = cc.XMLHttpRequest:new() -- 新建一个XMLHttpRequest对象  
  125.       xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_JSON -- json数据类型  
  126.       xhr:open("POST""http://httpbin.org/post")-- POST方式  
  127.   
  128.       local function onReadyStateChange()  
  129.         -- 显示状态码,成功显示200  
  130.         labelStatusCode:setString("Http Status Code:"..xhr.statusText)  
  131.         local response   = xhr.response -- 获得响应数据  
  132.         local output = json.decode(response,1) -- 解析json数据  
  133.         table.foreach(output,function(i, v) print (i, v) end)  
  134.         print("headers are")  
  135.         table.foreach(output.headers,print)  
  136.       end  
  137.   
  138.       -- 注册脚本方法回调  
  139.       xhr:registerScriptHandler(onReadyStateChange)  
  140.       xhr:send()-- 发送请求  
  141.   
  142.       labelStatusCode:setString("waiting...")  
  143.     end  
  144.   
  145.     -- 测试使用POST方式发送json的标签  
  146.     local labelPostJson = cc.Label:createWithTTF("Test Post Json", s_arialPath, 22)  
  147.     labelPostJson:setAnchorPoint(cc.p(0.5, 0.5)) -- 锚点  
  148.     local itemPostJson = cc.MenuItemLabel:create(labelPostJson) -- 菜单项标签  
  149.     itemPostJson:registerScriptTapHandler(onMenuPostJsonClicked) -- 注册菜单项点击  
  150.     itemPostJson:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 4 * space))  
  151.     menuRequest:addChild(itemPostJson)  
  152.   end  
  153.   
  154.   
  155.   -- 节点回调事件  
  156.   local function onNodeEvent(eventName)  
  157.     if "enter" == eventName then  
  158.       init()  
  159.     end  
  160.   end  
  161.     
  162.   -- 注册层的监听回调事件  
  163.   layer:registerScriptHandler(onNodeEvent)  
  164.   
  165.   return layer  
  166. end  
  167.   
  168. function XMLHttpRequestTestMain()  
  169.   local scene = cc.Scene:create() -- 创建场景  
  170.   scene:addChild(XMLHttpRequestLayer()) -- 添加层  
  171.   scene:addChild(CreateBackMenuItem()) -- 添加返回菜单项,具体实现查看helper.lua文件  
  172.   return scene  
  173. end  


效果图如下:

Test Get:


Test Post:


Test Post Binary:



Test Post JSON:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值