在淘宝小程序的框架下,ISV不能直接通过发起http请求的方式与外部服务通信。考虑到用户的实际需求,小程序云提供了一个专有的外联通道,通过云函数发起外部接口调用,所有的外联必须使用该方案执行。
开通云服务,通过云函数发起外联请求调用,云SDK版本 >= 1.1.3(建议:若外联调用失败,尝试把云函数文件夹下的 package.json文件内的 sdkversion 的版本改为 * )
调用API前需要先申请调用白名单。
出网IP白名单: 203.119.241.* (目前从未变更过,有变更会提前发公告)
GET请求URL长度不得超过256字节,超过部分将会被截断;
POST请求,相对GET请求审核更严格,如无必要请使用GET,申请POST后,GET权限同步开通;
POST请求支持application/json和application/x-www-form-urlencoded两种格式,?传入body参数格式不同,详细见示例
申请时,请务必详细说明需要使用HTTP外联的业务场景和需求,以及需要申请该域名下传输的全部字段信息(包括post请求中的body参数信息),未经过申请的字段将被平台过滤,无法调通。
context.cloud.httpApi.invoke(domain: string, path: strring, method: string, params: object, body: object, contentType: string): Promise<Result>;
字段名 |
类型 |
必选 |
默认值 |
说明 |
domain |
string |
是 |
- |
HTTP请求参数,与申请通过的HTTP的白名单中请求域名必须一致 |
path |
string |
否 |
/ |
HTTP请求path |
method |
string |
否 |
POST |
GET,POST |
params |
object |
否 |
- |
URL参数 |
body |
object |
否 |
- |
放置在BODY中的参数 |
headers |
object |
否 |
- |
HTTP请求头参数 |
返回Promise对象, resolve结果为API的执行结果。
使用云函数调用外部接口前,请先了解云函数使用流程。
server端代码示例(注意:header头不一样时,body参数格式不同)
//httpTunnel云函数 //1.application/json格式 exports.main = async (context) => { const result = await context.cloud.httpApi.invoke( { 'domain':'http://11.19.128.205:10511', 'params': { 'sign':'addadad', 'test':1, }, 'method':'POST', 'headers': { 'Content-Type':'application/json;charset=UTF-8', }, 'body':{ 'name':'cx', 'age':18, } }); return { success:true, msg: result } }; //2.x-www-form-urlencoded格式 exports.main = async (context) => { const result = await context.cloud.httpApi.invoke( { 'domain':'http://11.19.128.205:10511', 'params': { 'sign':'addadad', 'test':1, }, 'method':'POST', 'headers': { 'Content-Type':'application/x-www-form-urlencoded', }, 'body':"name=cx&age=18" }); return { success:true, msg: result } };
client端调用示例,详细请参见云函数调用示例。
// index.js const {cloud} = getApp(); Page({ data:{}, onLoad(query) { // 页面加载 }, testHttp(){ cloud.function.invoke('httpTunnel',{},'main').then(res => { console.log(res); }) }, });
云函数IDE测试只能看到云函数的调用结果日志,具体云函数内部调用外联接口的详细日志到控制台的链路分析中查看,便于更详细的对整个链路进行分析排查。