requesttask my.request(object object)
基础库 或更高版本; 且 支付宝客户端 10.1.32 或更高版本; 若版本较低,建议采取 兼容处理 。
支小宝客户端 支持
安诊儿客户端 支持
以 promise 风格调用: 支持 。
主体: 企业支付宝小程序 、 个人支付宝小程序
相关文档: 网络 api 使用须知 、 常见问题
发起https网络请求。使用前请注意阅读 网络 api 使用须知。
使用 my.request
、my.uploadfile
前,需要先配置 服务器域名白名单。
- 自研小程序: 登录 > 进入 小程序详情页面 > 开发 > 开发设置 > 服务器域名白名单。
- 第三方应用: 登录 > 进入 第三方应用详情页面 > 开发设置 > 服务器域名白名单。
在小程序开发过程中,可在小程序开发者工具(ide)配置忽略域名合法性检查,如果选择忽略,则在开发者工具中不会校验域名合法性。
- 小程序开发者工具: 右上角点击 详情 > 域名信息 > 忽略 http 请求域名合法性检查。
注意:
- 在开发者工具中配置的忽略域名合法性检查,仅对开发阶段生效,若小程序上线,请务必先在开放平台上配置 服务器域名白名单。
- 在控制台中修改关于 服务器域名白名单 的配置后,只对之后构建和发布的小程序版本生效,已上线的版本使用的是修改前的域名配置。
object object
查看示例
属性 | 类型 | 默认值 | 必填 | 兼容性 | 描述 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
url | string | - | 是 | - | 请求的 url,只支持 https 协议 |
||||||||||||||||||||||||||||
datatype | string | json_or_text | 否 | - | 指定出参 data 的类型。基础库 2.9.5 以前默认值为 json,2.9.5 为 json_or_text |
||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
method | string | get | 否 | - | http 请求方法 |
||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
data | string | object | arraybuffer | - | 否 | - | 传给服务器的数据(arraybuffer 在支付宝客户端 10.1.95 开始支持) |
||||||||||||||||||||||||||||
headers | object | - | 否 | - | 设置请求的 http 头对象,默认 {'content-type':'application/json'},该对象里面的 key 和 value 必须是 string 类型 |
||||||||||||||||||||||||||||
timeout | number | 30000 | 否 | - | 超时时间,取值 500 ~ 120000,单位 ms。设置小于 500 的值等效于 500 |
||||||||||||||||||||||||||||
referrerstyle | string | full | 否 | 基础库: 2.9.5 支付宝: 10.3.50 ide: 3.5.1 |
referer 样式,用于控制当前请求 header 对象中 referer 字段格式。 |
||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
enablecookie | boolean | - | 否 | 支付宝: 10.2.33 |
是否手工设置 cookie。如果为 true,请求将使用 headers 中设置的 cookie;如果为 false,则 headers 中的 cookie 字段将被忽略,请求头中将包含服务端上一次返回的 cookie(如果有且未过期) |
||||||||||||||||||||||||||||
enablehttp2 | boolean | true | 否 | 支付宝: 10.5.10 |
开启 http/2。默认为 true,只要目标服务器支持就会以 http/2 通信;如果置为 false,则禁用 http/2 |
||||||||||||||||||||||||||||
success | function | - | 否 | - | 调用成功的回调函数 |
||||||||||||||||||||||||||||
fail | function | - | 否 | - | 调用失败的回调函数 |
||||||||||||||||||||||||||||
complete | function | - | 否 | - | 调用结束的回调函数(调用成功、失败都会执行) |
url 参数说明
- 只支持 https 协议的请求
- 只支持与 域名白名单 中的域名通讯
- 开发过程中,可通过开发者工具 详情 > 域名信息 > 忽略 http 请求域名合法性检查 忽略该限制
- 正式/体验版本必须在 小程序详情页面 > 开发 > 开发设置 > 服务器域名白名单 中配置,并重新构建/发布小程序
data 参数说明
传给服务器的数据最终会是 string 类型,如果 data 不是 string 类型,会被转换成 string 。转换规则如下:
- 若方法为
get
,会将 data 转换成 querystring 形式:encodeuricomponent(k)=encodeuricomponent(v)&encodeuricomponent(k)=encodeuricomponent(v)...
,追加在 url 后面。 - 若方法为
post
且headers['content-type']
为application/json
,会对数据进行 json 序列化。 - 若方法为
post
且headers['content-type']
为application/x-www-form-urlencoded
,会将 data 转换成 querystring 形式:encodeuricomponent(k)=encodeuricomponent(v)&encodeuricomponent(k)=encodeuricomponent(v)...
,追加在 url 后面。
headers 参数说明
- "content-type" 字段默认为
application/json
referer
可以通过referrerstyle
参数进行格式控制cookie
字段必须结合enablecookie: true
才能生效
referrerstyle 参数说明
- 该参数只在客户端
10.3.50
及以上版本支持,低于10.3.50
的客户端相当于 referrerstyle 恒为 'full',referer 为当前页面的完整 url(含 hash),某些情况下可能导致 header 超长请求失败。 - 在
app.json
中设置behavior.requestreferrerstyle
字段可以改变referrerstyle
参数的默认值。示例如下。注意:behavior.requestreferrerstyle
兼容性同referrerstyle
参数的兼容性。
{
"pages": ["pages/index/index", "pages/logs/logs"],
"window": {
"defaulttitle": "demo"
},
"behavior": {
"requestreferrerstyle": "full" // 修改 my.request 参数 referrerstyle 的默认值为 full
}
}
success 回调函数
参数
object res
查看示例
属性 | 类型 | 描述 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
data | string | object | arraybuffer | 目标服务器返回的数据,数据类型按由入参 datatype 字段指定 |
|||||||||||||||||||||||||
status | number | 目标服务器返回的 http 状态码 |
|||||||||||||||||||||||||
headers | object | 目标服务器返回的 http 响应头 |
|||||||||||||||||||||||||
profile | object | 网络请求过程中一些调试信息 |
|||||||||||||||||||||||||
|
fail 回调函数
参数
object err
查看示例
属性 | 类型 | 描述 |
---|---|---|
error | number | 错误码 |
errormessage | string | 错误信息 |
data | string/object/arraybuffer | 开发者服务器返回的数据,格式取决于请求时的 datatype 参数,如果 datatype 值为 base64 时,返回的是符合 规范的内容字符串。 |
status | number | 开发者服务器返回的 http 状态码 |
headers | object | 开发者服务器返回的 http response header |
requesttask
请求任务对象。可用于获取 http 响应头,以及取消请求任务
fail 回调的参数为 object,error
属性为错误码,errormessage
属性为错误消息。
错误码 | 错误消息 | 凯发app官方网站的解决方案 |
---|---|---|
2 | 参数错误。 | 请检查是否有必填项没传,参数类型是否正确 |
xxx 参数类型错误 | 请检查参数是否传错类型 |
|
4 | 未配置域名白名单,无权访问域名。查看如何配置:https://xxx.. |
注意:
|
9 | request:fail abort |
调用了 requesttask.abort() 中断了请求任务。 |
12 | 似乎已断开与互联网的连接。 | 建议检查网络环境是否正常,服务器是否稳定。 |
发生了ssl错误,无法建立与该服务器的安全连接。 | 请检查您的证书是否过期。 |
|
未能找到使用指定主机名的服务器。 | 请检查您的域名是否正确。 |
|
13 | 超时。 |
建议检查网络环境是否正常,服务器是否正常响应,若请求需要时间长,可适当设置超时时间 timeout。 |
14 | json parse data error | 解码失败 |
|
http status error | http 404、500、504 等异常错误。可打开 ide 调试器 > network 可以查看具体的错误信息,真机也可通过错误回调中的 status、data 字段查看具体的错误码和错误信息。
|
|
20 | 请求 url 不支持 http,请使用 https。 | 小程序已经不支持 http 请求,请使用 https。 |
my.request({
url: 'https://httpbin.org/post',
method: 'post',
data: {
from: '支付宝',
production: 'alipayjsapi',
},
headers: {
'content-type': 'application/json', //默认值
},
datatype: 'json',
success: function (res) {
my.alert({ content: 'success' });
},
fail: function (error) {
console.error('fail: ', json.stringify(error));
},
complete: function (res) {
my.hideloading();
my.alert({ content: 'complete' });
},
});
my.request({
url: 'https://gw.alipayobjects.com/mdn/miniapp_de/afts/img/a*g1kwsjbe2zeaaaaaaaaaaabjarqnaq',
method: 'get',
datatype: 'base64',
success: resp => {
console.log('resp data length', resp.data.length);
console.log('resp data', resp.data); // 返回格式类似于:data:image/png;base64,ivborw0kg...
},
fail: err => {
console.log('error', err);
},
});
my.request({
url: 'https://httpbin.org/put',
method: 'put',
data: {
from: '支付宝',
production: 'alipayjsapi',
},
headers: {
'content-type': 'application/json', //默认值
},
datatype: 'json',
success: function (res) {
my.alert({ content: 'success' });
},
fail: function (error) {
console.error('fail: ', json.stringify(error));
},
complete: function (res) {
my.hideloading();
my.alert({ content: 'complete' });
},
});
my.request({
url: 'https://httpbin.org/delete',
method: 'delete',
data: {
from: '支付宝',
production: 'alipayjsapi',
},
headers: {
'content-type': 'application/x-www-form-urlencoded',
},
datatype: 'json',
success: function (res) {
console.log('正常请求' json.stringify(res));
my.alert({
content: '正常请求' json.stringify(res),
});
},
fail: function (error) {
console.error('fail: ', json.stringify(error));
},
complete: function (res) {},
});
{
"data": {},
"status": 200,
"headers": {
"server": "tengine",
"date": "fri, 23 sep 2022 08:33:43 gmt",
"content-type": "application/json; charset=utf-8",
"content-length": "725",
"connection": "keep-alive",
"keep-alive": "timeout=5",
"x-server-id": "49-5352",
"request-id": "0bff86ca16639220231708789893",
"x-officeingress-sign": "927c5956339dafa23904a10bfc8589cf33251eaebe5b052c7ee623eee9f43e9b47cc69def3b68e1e840f452f17026ca642dd1b9c9ff4a586ee27d6c3e173a3e039884cf89d3038d1",
"vary": "accept-encoding",
"x-rc-zone": "gz00d-gz00g",
"x-content-version": "tue, 23 aug 2022 11:36:07 gmt",
"x-render-pack-md5": "20d9993e41ed62ffcd41aa3869fe148c",
"x-render-pack-pro-mode": "1",
"access-control-allow-origin": "*",
"cache-control": "max-age=0, s-maxage=120, must-revalidate",
"x-render-date": "fri, 23 sep 2022 08:33:43 gmt",
"etag": "w/\"2e2-qvaq0jsjuxu/qqwpmvtms/etwtm\"",
"x-frame-options": "sameorigin",
"x-xss-protection": "1; mode=block",
"x-content-type-options": "nosniff",
"x-download-options": "noopen"
}
}
{
"error": 4,
"errormessage": "未配置域名白名单,无权访问域名。查看如何配置:https://opendocs.alipay.com/mini/api/owycmh#错误码"
}
// 当错误码为 14 或 19 时,会多返回 status、data、headers。可通过这些字段获取服务端相关错误信息。
{
"status": 405,
"headers": {
"server": "openresty/1.11.2.5",
"x-powered-by": "php/5.6.32",
"content-type": "text/html; charset=utf-8",
"access-control-allow-methods": "post, get, options",
"access-control-allow-origin": "*",
"date": "tue, 14 mar 2023 02:01:06 gmt",
"access-control-allow-headers": "content-type",
"connection": "keep-alive"
},
"data": "",
"error": 19,
"errormessage": "http status error"
}
-
tip如需在不同环境请求不同的 url,可通过 my.env 的 clientenv (基础库 2.7.24 )判断当前客户端环境(生产环境/沙箱环境),以及通过 my.getaccountinfosync().miniprogram.envversion 判断小程序自身的版本(开发版/正式版等)。
-
bug支付宝 10.3.90 以下版本 android 端 my.request 不支持 http 重定向,请求会失败。此问题 10.3.90 已修复
-
bug支付宝 10.5.10 以下版本,当响应的状态码 >= 400 时,ios 端 fail 回调参数的 data 字段可能为空。此缺陷 10.5.10 已修复。
-
bugios 端 10.5.10 以前,即使 url 是 https 协议,可能也会误报
{error: 20, errormessage: '请求 url 不支持 http,请使用 https'}
。此缺陷 10.5.10 版本已修复。
q:my.request 是否支持 ip 地址请求?是否支持 ipv6 域名?
- 安卓支付宝客户端 10.3.50、ide 3.8.2 开始支持 ip 地址请求。在开发阶段,可勾选小程序开发者工具右上角 详情 > 域名信息 > 忽略 http 请求域名合法性检查,以使用本地局域网 ip 进行调试。
ios 端使用 ip 地址请求时,请注意将 手机设置 > 支付宝 > “本地服务”开关打开。 - 支付宝客户端 10.2.30 或更高版本,my.request 支持 ipv6 域名。
- my.request 不建议使用关于 127.0.0.1 的测试请求。
q:my.request 支持 promise 风格调用吗?
支持。样例: my.request({url: ''}).then(res => console.log(res)).catch(err => console.log(err))
q:小程序是否支持 cookie?
my.request 默认支持 cookie,但在 android 上有较小概率会发生丢失,不建议使用。强依赖 cookie 的情况下,可从 response headers 读取 set-cookie
字段,在下次请求时通过入参 headers 手工设置 cookie(注意:必须同时设置入参 enablecookie 为 true)。
q:request 请求头过大导致 http 请求返回 400 状态码,如何处理?
如果是 referer 过长导致,可以使用 referrerstrategy 参数来对 referer 格式进行控制(设置为 'index' 或 'page');如需兼容低版本的客户端(10.3.50 以下不支持 referrerstrategy 参数),可以通过配置服务器参数解决,例如 nginx 服务器可以通过调整 client_header_buffer_size 和 large_client_header_buffers 参数来控制尺寸限制;如果无法更改服务器配置,还可以通过尝试判断当前客户端版本号提醒用户进行升级。