参考文章:开发小游戏(服务端开发看)。
参考文章《外部域名添加》的开通云服务和添加章节。
参考文章:链接
参考文章的第一章。
将域名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;