参考文章:开发小游戏(服务端开发看)。
参考文章《外部域名添加》的开通云服务和添加章节。
参考文章:链接
参考文章的第一章。
将域名g.alicdn.com配置到后台上,下文会用到;
选择对应的项目,然后选择设置项目保存路径,点击【确定】。
1 | npm install @tbmp /mp-cloud-sdk |
在game.js的第一行引入
1 | import cloud from '@tbmp/mp-cloud-sdk' ; |
测试资源(仅做演示用):
1 | https: //g.alicdn.com/eva-assets/d95d6d1ef8bf347ef9ca28d4e121304e/0.0.1/tmp/27540b5/40614ca0-44b2-4106-8f27-66765e86e5f8.json |
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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 , } }); console.log( '收到的数据' , JSON.stringify(result)); } catch (e) { console.error(e); } } |
注意:
1. 游戏上线前一定要将env设置为online。
2. 如果你要在cocos中使用空应用的话,需要参考《Cocos/Laya引擎适配》文档的FAQ关于空应用的内容。
在game.js的代码尾部调用测试函数
1 | httptest(); |
点击构建日志可以查看构建日志。
设置权限:参考文档设置成员。
查看【真机调试】日志
参考文章:开发小游戏(前端开发看)。
《在 Cocos Creator 开发并导出淘宝小游戏》章节。
在HelloWorld.js的onLoad函数中进行测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | onLoad: function () { this .label.string = this .text; 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请查看附录。
将数据进行编码:
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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存在问题,正在修复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | 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; |