`
weiyinchao88
  • 浏览: 1234273 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
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下找到。


示例代码:
--[[
=================
XMLHttpRequestTest.lua
http请求
=================
]]--
require("json")

local function XMLHttpRequestLayer()
  local layer = cc.Layer:create()-- 创建层
  local winSize = cc.Director:getInstance():getWinSize()-- 得到窗口大小
  local margin = 40-- 间距
  local space  = 35-- 宽度

  local function init()
    local label = cc.Label:createWithTTF("XML Http Request Test", s_arialPath, 28)-- 使用ttf文字格式的标签
    label:setAnchorPoint(cc.p(0.5, 0.5))-- 设置锚点
    label:setPosition(cc.p(winSize.width / 2, winSize.height - margin))-- 设置显示位置,宽度为屏幕的中间,高度为屏幕高度减去间距
    layer:addChild(label, 0) -- 添加标签到层中

    -- 显示返回码的标签
    local labelStatusCode = cc.Label:createWithTTF("HTTP Status Code", s_markerFeltFontPath, 20)
    labelStatusCode:setAnchorPoint(cc.p(0.5, 0.5))
    labelStatusCode:setPosition(cc.p(winSize.width / 2,  winSize.height - margin - 6 * space))
    layer:addChild(labelStatusCode)

    local menuRequest = cc.Menu:create() -- 创建菜单
    menuRequest:setPosition(cc.p(0,0))
    layer:addChild(menuRequest) -- 添加菜单

    --Get
    local function onMenuGetClicked()
      local xhr = cc.XMLHttpRequest:new() -- http请求
      xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_STRING -- 响应类型
      xhr:open("GET", "http://httpbin.org/get") -- 打开链接

      -- 状态改变时调用
      local function onReadyStateChange()
        -- 显示状态文本
        local statusString = "Http Status Code:"..xhr.statusText
        labelStatusCode:setString(statusString)
        print(xhr.response)
      end

      -- 注册脚本回调方法
      xhr:registerScriptHandler(onReadyStateChange)
      xhr:send() -- 发送请求

      labelStatusCode:setString("waiting...")
    end

    -- 测试Get的标签
    local labelGet  = cc.Label:createWithTTF("Test Get", s_arialPath, 22)
    labelGet:setAnchorPoint(cc.p(0.5, 0.5))
    local itemGet  =  cc.MenuItemLabel:create(labelGet) -- 菜单标签
    itemGet:registerScriptTapHandler(onMenuGetClicked) -- 菜单点击事件
    itemGet:setPosition(cc.p(winSize.width / 2, winSize.height - margin - space))
    menuRequest:addChild(itemGet) -- 添加菜单项

    --Post
    local function onMenuPostClicked()
      local xhr = cc.XMLHttpRequest:new() -- 新建一个XMLHttpRequest对象
      xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_STRING -- 相应类型为字符串
      xhr:open("POST", "http://httpbin.org/post")-- post方式
      local function onReadyStateChange()
        labelStatusCode:setString("Http Status Code:"..xhr.statusText)
        print(xhr.response)
      end
      -- 注册脚本方法回调
      xhr:registerScriptHandler(onReadyStateChange)
      xhr:send()-- 发送

      labelStatusCode:setString("waiting...")
    end

    -- 测试Post的标签
    local labelPost = cc.Label:createWithTTF("Test Post", s_arialPath, 22)
    labelPost:setAnchorPoint(cc.p(0.5, 0.5)) -- 设置锚点
    local itemPost =  cc.MenuItemLabel:create(labelPost) -- 设置菜单项标签
    itemPost:registerScriptTapHandler(onMenuPostClicked) -- 注册菜单项点击回调方法
    itemPost:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 2 * space))
    menuRequest:addChild(itemPost)

    --Post Binary
    local function onMenuPostBinaryClicked()
      local xhr = cc.XMLHttpRequest:new()-- 新建一个XMLHttpRequest对象
      xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_ARRAY_BUFFER --返回数据为字节流
      xhr:open("POST", "http://httpbin.org/post") -- 打开Socket

      -- 状态改变时调用
      local function onReadyStateChange()
        local response   = xhr.response -- 获得返回数据
        local size     = table.getn(response) -- 获得返回数据大小
        local strInfo = ""

        for i = 1,size do
          if 0 == response[i] then
            strInfo = strInfo.."\'\\0\'"
          else
            strInfo = strInfo..string.char(response[i])
          end
        end
        labelStatusCode:setString("Http Status Code:"..xhr.statusText)
        print(strInfo)
      end

      -- 注册脚本方法回调
      xhr:registerScriptHandler(onReadyStateChange)
      xhr:send()-- 发送

      labelStatusCode:setString("waiting...")
    end

    -- 测试使用Post请求方式发送字节流
    local labelPostBinary = cc.Label:createWithTTF("Test Post Binary", s_arialPath, 22)
    labelPostBinary:setAnchorPoint(cc.p(0.5, 0.5))
    local itemPostBinary = cc.MenuItemLabel:create(labelPostBinary)
    itemPostBinary:registerScriptTapHandler(onMenuPostBinaryClicked)
    itemPostBinary:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 3 * space))
    menuRequest:addChild(itemPostBinary)

    --Post Json
    local function onMenuPostJsonClicked()
      local xhr = cc.XMLHttpRequest:new() -- 新建一个XMLHttpRequest对象
      xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_JSON -- json数据类型
      xhr:open("POST", "http://httpbin.org/post")-- POST方式

      local function onReadyStateChange()
        -- 显示状态码,成功显示200
        labelStatusCode:setString("Http Status Code:"..xhr.statusText)
        local response   = xhr.response -- 获得响应数据
        local output = json.decode(response,1) -- 解析json数据
        table.foreach(output,function(i, v) print (i, v) end)
        print("headers are")
        table.foreach(output.headers,print)
      end

      -- 注册脚本方法回调
      xhr:registerScriptHandler(onReadyStateChange)
      xhr:send()-- 发送请求

      labelStatusCode:setString("waiting...")
    end

    -- 测试使用POST方式发送json的标签
    local labelPostJson = cc.Label:createWithTTF("Test Post Json", s_arialPath, 22)
    labelPostJson:setAnchorPoint(cc.p(0.5, 0.5)) -- 锚点
    local itemPostJson = cc.MenuItemLabel:create(labelPostJson) -- 菜单项标签
    itemPostJson:registerScriptTapHandler(onMenuPostJsonClicked) -- 注册菜单项点击
    itemPostJson:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 4 * space))
    menuRequest:addChild(itemPostJson)
  end


  -- 节点回调事件
  local function onNodeEvent(eventName)
    if "enter" == eventName then
      init()
    end
  end
  
  -- 注册层的监听回调事件
  layer:registerScriptHandler(onNodeEvent)

  return layer
end

function XMLHttpRequestTestMain()
  local scene = cc.Scene:create() -- 创建场景
  scene:addChild(XMLHttpRequestLayer()) -- 添加层
  scene:addChild(CreateBackMenuItem()) -- 添加返回菜单项,具体实现查看helper.lua文件
  return scene
end


效果图如下:

Test Get:


Test Post:


Test Post Binary:



Test Post JSON:




分享到:
评论

相关推荐

    Cocos2d-x实战_Lua卷 _第2版

    《Cocos2d-x实战_Lua卷_第2版》是一本专为游戏开发者准备的指南,主要聚焦于使用Cocos2d-x框架与Lua语言进行游戏开发。Cocos2d-x是一个开源的游戏开发框架,它允许开发者用C++、Lua或者JavaScript编写游戏,并且可以...

    cocos2d-x+lua游戏demo源码

    【cocos2d-x+lua游戏demo源码】是一个基于cocos2d-x游戏引擎和lua脚本语言的游戏示例项目。cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于移动设备,如iOS和Android。lua是一种轻量级的、面向过程的编程语言,...

    cocos2D-lua 核心编程内置代码

    在“Cocos2d-x之Lua核心编程(第二版)_配套代码”中,我们可以找到一系列的示例和代码,这些代码涵盖了Cocos2d-lua的核心功能和编程技巧。 一、Cocos2d-lua简介 Cocos2d-lua是Cocos2d-x的一个扩展,它允许开发者使用...

    关东升_Cocos2d-x实战 Lua卷

    - **高级特性**:除了基本的操作之外,《Cocos2d-x实战 Lua卷》还探讨了一些高级主题,如性能优化、多线程处理、网络通信等内容,使读者能够更好地应对复杂的游戏场景。 #### 4. 下载资源包及使用方法 由于本书包含...

    cocos2d-x 动画工具 Flash2Cocos2d-x 1.3

    在压缩包文件"jyinkailej-Flash2Cocos2d-x-8c0deff"中,可能包含了Flash2Cocos2d-x工具的源码、文档、示例项目和其他相关资源,供开发者学习和使用。这些资源可以帮助开发者深入理解如何使用该工具,并进行实际的...

    cocos2d-x-3.2.zip

    《cocos2d-x 3.2:经典游戏开发框架深度解析》 cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形/交互式...

    Cocos2d-x实战C++卷关东升著完整版pdf

    Cocos2d-x基于C++,但也支持Lua和JavaScript,但本书主要关注C++的使用。C++作为一门强大的系统级编程语言,提供了面向对象的特性,使得游戏开发中的对象管理和性能优化更为高效。读者需要理解C++的基本语法、类与...

    cocos2d-x与lua

    在文章的提纲中提到了cocos2d-x+Lua游戏开发的流程,包括搭建开发环境、Lua脚本的基本使用、游戏框架的进一步优化、自定义C++对象到Lua的导出、C++与Lua间的数据与对象传递、Lua中的异步网络请求等关键步骤。...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    Cocos2d-x框架基于C++,同时提供了Lua和JavaScript的绑定,使得开发者可以根据自己的喜好选择编程语言。JS卷特别针对JavaScript开发者,详细介绍了如何利用Cocos2d-JS进行游戏开发,涵盖了从基础概念到高级技术的...

    Cocos2d-x学习笔记

    - 学习脚本语言:虽然Cocos2d-x支持多语言开发,但了解JavaScript、Lua等脚本语言,可以快速实现游戏功能和逻辑。 Cocos2d-x框架除了Windows平台外,还支持iOS、Android、Mac OS X、Web等平台,初学者在掌握了...

    cocos2dx lua核心编程(第二版)配套代码

    《Cocos2d-x之Lua核心编程(第二版)》配套代码是一份极其重要的学习资源,旨在帮助开发者深入理解和熟练运用Cocos2d-x游戏引擎与Lua语言进行游戏开发。Cocos2d-x是一个跨平台的游戏开发框架,而Lua则是一种轻量级的...

    cocos2d-x 案例开发大全 第二章(源码)

    《cocos2d-x案例开发大全》第二章的源码主要涵盖了使用cocos2d-x进行游戏开发的各种实践技巧和示例。cocos2d-x是一个开源的游戏开发框架,基于C++,支持跨平台,包括iOS、Android、Windows等多个操作系统。本章的...

    Cocos2d-x实战++Lua卷.pdf

    根据提供的文件信息,本文将重点围绕“Cocos2d-x实战++Lua卷”这一主题进行深入探讨,并结合描述部分给出的知识点,详细阐述Cocos2d-x与Lua在游戏开发中的应用。 ### Cocos2d-x简介 Cocos2d-x是一款开源的游戏引擎...

    cocos2d-lua整合到ios工程.zip

    在iOS平台上开发游戏时,有时候会使用到Cocos2d-x框架,而为了实现更高效、更便捷的编程,开发者可能会选择使用Lua作为脚本语言。"cocos2d-lua整合到ios工程.zip"这个压缩包文件提供了一个将Cocos2d-lua集成到原生...

    Cocos2d-x demo程序

    Cocos2d-x 是一个广泛使用的开源游戏开发框架,它基于C++,并提供了Python、Lua等语言的绑定,使得开发者能够用多种编程语言来创建2D和3D游戏。这个" Cocos2d-x demo程序 "是作者使用Cocos2d-x编写的示例项目,用于...

    瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体代码

    在本篇中,我们将深入探讨使用Cocos2d-x 3.2框架集成Box2D物理引擎实现自由落体效果的编程技术。Cocos2d-x是一个广泛使用的开源游戏开发框架,它支持多种平台,包括iOS、Android以及桌面系统。Box2D是一个强大的2D...

    cocos2d-1.0.1-x-0.10.0

    Cocos2d-x 是一个开源的游戏开发框架,主要用于创建2D游戏、图形界面以及实时应用程序。这个框架基于C++,并且提供了多种语言接口,包括Python、JavaScript和Lua,让开发者可以选择他们熟悉的编程语言进行游戏开发。...

    Cocos2d-x实战:Lua卷(第2版)书籍代码

    这是书籍 Cocos2d-x实战:Lua卷(第2版)的代码,关东升老师的,这里分享出来。除了章节的小示例代码外,还有一个《迷失航线》的游戏示例代码。这是一个下载地址。

    cocos2d-x 3.x游戏开发实战光盘

    《cocos2d-x 3.x游戏开发实战光盘》是一个深入探讨cocos2d-x 3.x游戏引擎开发的资源集合,旨在帮助开发者通过实际案例掌握这一强大的2D游戏开发工具。cocos2d-x是一款开源的游戏开发框架,基于C++,广泛应用于跨平台...

    Cocos2d-X游戏源码大合集.rar

    Cocos2d-X是一款强大的开源跨平台2D游戏开发框架,它基于C++,并提供了JavaScript和Lua等多种脚本语言接口。这个“Cocos2d-X游戏源码大合集.rar”文件显然包含了大约三十个使用Cocos2d-X开发的游戏实例源代码,对于...

Global site tag (gtag.js) - Google Analytics