From: http://www.jb51.cc/article/p-gfkvrdrw-sn.html

本篇博客介绍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

--[[
=================
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 s_arialPath = "fonts/arial.ttf"
  local s_markerFeltFontPath = "fonts/Marker Felt.ttf"

  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",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",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",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",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 3.2 Lua示例 XMLHttpRequestTestHttp网络请求的更多相关文章

  1. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  2. 移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  4. ios – 在applicationWillEnterForeground触发时更改UIView

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. ios – 错误域= NSURLErrorDomain代码= -1003“找不到具有指定主机名的服务器

    当我尝试在设备上运行应用程序时出现此错误.当我在模拟器上运行它并且post请求正常工作时,我没有收到此错误.这是我的代码片段:任何帮助表示赞赏.谢谢解决方法此错误通常会提示DNS相关问题.检查设备上的DNS设置并确认您可以使用Safari或其他浏览器浏览互联网.如果有一个url,你可以在同一台服务器上获取,尝试直接在设备上的Safari中访问它.

  6. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  7. UILabel导致应用程序在添加到视图时崩溃(仅限Xcode 6和iOS 8)

    我已将我的项目转换为Xcode6,以便为iOS8构建.但是,特定的UILabel会导致应用程序在添加到视图层次结构时崩溃.这是我收到的唯一错误日志:我无法在项目中的任何位置找到contentInsetsFromFonts方法.此外,我甚至无法在网上任何地方找到它的参考,包括Apple的文档.我没有为这个UIViewController使用NIB,因此UI是在loadView方法中构建的:该应用程序

  8. iOS 7通知中心与标签一样

    您可以试试,也许在将模糊应用到标签之前为模糊添加一点白色.

  9. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  10. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部