参考文章:开发小游戏(服务端开发看)。
参考文章《外部域名添加》的开通云服务和添加章节。
参考文章:链接
参考文章的第一章。
将域名g.alicdn.com配置到后台上,下文会用到;
选择对应的项目,然后选择设置项目保存路径,点击【确定】。
npm install @tbmp/mp-cloud-sdk
在game.js的第一行引入
import cloud from '@tbmp/mp-cloud-sdk';
测试资源(仅做演示用):
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关于空应用的内容。
在game.js的代码尾部调用测试函数
httptest();
点击构建日志可以查看构建日志。
设置权限:参考文档设置成员。
查看【真机调试】日志
参考文章:开发小游戏(前端开发看)。
《在 Cocos Creator 开发并导出淘宝小游戏》章节。
在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(); }
目前淘宝小游戏的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的在淘宝小游戏的HttpRequest存在问题,正在修复。
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;