文档中心 > 开发指南

一、配置

参考文章:开发小游戏(服务端开发看)

参考文章《外部域名添加》的开通云服务添加章节。

二、空小游戏项目发起http请求

1. 创建项目

1)后台创建项目

参考文章:链接

参考文章的第一章。

将域名g.alicdn.com配置到后台上,下文会用到;

2)IDE创建项目

选择对应的项目,然后选择设置项目保存路径,点击【确定】。

2. 开发

1)安装云服务的SDK

npm install @tbmp/mp-cloud-sdk

2)引入库

在game.js的第一行引入

import cloud from '@tbmp/mp-cloud-sdk';

3)定义测试函数

测试资源(仅做演示用):

https://g.alicdn.com/eva-assets/d95d6d1ef8bf347ef9ca28d4e121304e/0.0.1/tmp/27540b5/40614ca0-44b2-4106-8f27-66765e86e5f8.json

代码:

const httptest = async () => {
  // const { cloud } = getApp();
  try {

    cloud.init({
      //test、online 
      env: 'test' 
    }); 

    const result = await cloud.application.httpRequest({
      //不需要完整域名,只需要接口访问路径即可
      path: '/eva-assets/d95d6d1ef8bf347ef9ca28d4e121304e/0.0.1/tmp/27540b5/40614ca0-44b2-4106-8f27-66765e86e5f8.json',
      'method': 'GET',
      'headers': { },
      //对于一个小程序关联多个云应用的场景,调用非默认云应用,需要指定对应的云应用Id,超时时间单位ms
      //cloudAppId为域名白名单配置后获取,在配置处查看具体参数
      'exts': {
        "cloudAppId": "xxxx",
        "timeout": 1000,
        "domain": "https://g.alicdn.com"
      }
    });
    console.log('收到的数据', JSON.stringify(result));
  } catch (e) {
    console.error(e);
  }
}

注意:

1. 游戏上线前一定要将env设置为online。

2. 如果你要在cocos中使用空应用的话,需要参考《Cocos/Laya引擎适配》文档的FAQ关于空应用的内容。

4)调用

在game.js的代码尾部调用测试函数

httptest();

3. 调试

1)IDE调试

2)真机调试

① 打开云构建

② 生成调试二维码

点击构建日志可以查看构建日志。

③ 用权限的账号扫码进入游戏

设置权限:参考文档设置成员

查看【真机调试】日志

三、cocos使用getXMLHttpRequest进行http请求

1. 创建和导出cocos项目

参考文章:开发小游戏(前端开发看)

《在 Cocos Creator 开发并导出淘宝小游戏》章节。

2. 在cocos开发

在HelloWorld.js的onLoad函数中进行测试。

onLoad: function () {
  this.label.string = this.text;
  let url = 'https://g.alicdn.com/eva-assets/d95d6d1ef8bf347ef9ca28d4e121304e/0.0.1/tmp/27540b5/40614ca0-44b2-4106-8f27-66765e86e5f8.json';
  let oReq = cc.loader.getXMLHttpRequest();
  console.log("oReq", oReq)
  oReq.open('GET', url, true);
  // oReq.responseType = 'arraybuffer';

  oReq.onload = (oEvent) => {
    if (oReq.readyState !== 4) {
      cc.log('下载失败');
      return;
    }
    if (oReq.status === 200) {
      let data = oReq.response;
      console.log('普通JSON数据', {data});
    } else {
      cc.log('下载失败');
    }
  };
  oReq.send();
}

3. 处理二进制

目前淘宝小游戏的http协议不支持二进制数据传输,仅支持字符串发送。建议直接将二进制数据转化成字符串发送,然后客户端收到后解码。实例如下:

utils.js请查看附录。

将数据进行编码:

import fs from 'fs';
import utils from './utils.js'

const originalString = '淘宝互动开放小游戏测试';

// 创建一个 Buffer 实例来处理字符串转换
const buffer = utils.stringToArrayBuffer(encodeURIComponent(originalString))
const base64String = utils.arrayBufferToBase64(buffer);

// 或者将它写入一个文件,然后在 Web 端读取这个文件
fs.writeFileSync('utf8_arraybuffer_base64', base64String);

客户端:

(仅做演示用):https://g.alicdn.com/hdtest/igo_assets_test/0.3.0/bin/utf8_arraybuffer_base64

let binurl = 'https://g.alicdn.com/hdtest/igo_assets_test/0.3.0/bin/utf8_arraybuffer_base64';
let binReq = cc.loader.getXMLHttpRequest();
console.log("binReq", binReq)
binReq.open('GET', binurl, true);

binReq.onload = (oEvent) => {
  console.log('onload','binReq',binReq);
  if (binReq.readyState !== 4) {
    cc.log('下载失败');
    return;
  }
  if (binReq.status === 200) {
    const data = binReq.response;
    // 解码Base64字符串到二进制字符串
    const binary= utils.base64ToArrayBuffer(data);
    const decodedText = utils.arrayBufferToString(binary);
    const text = decodeURIComponent(decodedText);
    console.log('二进制解码的数据', {text}); 
  } else {
    cc.log('下载失败');
  }
};
binReq.send();

四、laya中使用 Laya.HttpRequest 进行http请求

目前laya的在淘宝小游戏的HttpRequest存在问题,正在修复。

五、附录

utils.js

const utils = {
  /**
     * @param {Object} target
     * @param {Object} origin
     * @param {String} methodName
     * @param {String} targetMethodName
     */
  cloneMethod (target, origin, methodName, targetMethodName) {
    if (origin[methodName]) {
      targetMethodName = targetMethodName || methodName;
      target[targetMethodName] = origin[methodName].bind(origin);
    }
  },

  /**
     *
     * @param {String} str
     * @returns
     */
  encode (str) {
    let encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
    const string = String(str);
    let result = '';
    let currentIndex = 0;
    let sum = void 0;
    while (string.charAt(0 | currentIndex) || (encodings = '=', currentIndex % 1)) {
      currentIndex += 0.75;
      const currentCode = string.charCodeAt(currentIndex);
      if (currentCode > 255) {
        // Cannot handle when it is greater than 255
        throw new Error('"btoa" failed');
      }
      sum = sum << 8 | currentCode;
      const encodeIndex = 63 & sum >> 8 - currentIndex % 1 * 8;
      result += encodings.charAt(encodeIndex);
    }

    return result;
  },

  /**
     *
     * @param {String} str
     */
  decode (str) {
    const encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
    let res = '';
    const string = String(str).replace(/[=]+$/, '');
    let o;
    let r;
    let i = 0;
    let currentIndex = 0;
    while (r = string.charAt(currentIndex)) {
      currentIndex += 1;
      r = encodings.indexOf(r);
      if (~r) {
        o = i % 4 ? 64 * o + r : r;
        if (i++ % 4) {
          res += String.fromCharCode(255 & o >> (-2 * i & 6));
        }
      }
    }

    return res;
  },

  /**
     *
     * @param {ArrayBuffer} buffer
     */
  arrayBufferToBase64 (buffer) {
    return utils.encode(utils.arrayBufferToString(buffer));
  },

  /**
     *
     * @param {String} base64
     */
  base64ToArrayBuffer (base64) {
    return utils.stringToArrayBuffer(utils.decode(base64));
  },

  /**
     *
     * @param {ArrayBuffer} buffer
     */
  arrayBufferToString (buffer) {
    let result = '';
    const uintArray = new Uint8Array(buffer);
    const byteLength = uintArray.byteLength;
    for (let i = 0; i < byteLength; i++) {
      result += String.fromCharCode(uintArray[i]);
    }
    return result;
  },

  /**
     *
     * @param {String} string
     */
  stringToArrayBuffer (string) {
    const length = string.length;
    const uintArray = new Uint8Array(length);
    for (let i = 0; i < length; i++) {
      uintArray[i] = string.charCodeAt(i);
    }
    return uintArray.buffer;
  },
};

module.exports = utils;

FAQ

关于此文档暂时还没有FAQ
返回
顶部