小程序网络请求报错排查方案
- 通过接口返回的报错信息进行排查,根据报错信息 error 中的错误码对照 my.request 的错误码表格进行排查。
- 根据 status 的 http 状态码排查具体原因。如果 http 响应码以 5、6 字开头,说明是服务端问题,可能是服务器配置问题、请求接收问题,可以在浏览器中尝试这个地址能否正常访问,是否有报错。
- 根据 errormessage 参数中的错误信息进行排查,例如 "json parse data error" 为请求格式错误。
- 如果后端服务器可以接受请求,则可通过打印出小程序前端的请求数据和后端收到的请求数据进行匹配分析来寻找错误原因。
- 如果后端服务器不可以接受请求,请排查服务器的网络设置,查询是否有白名单拦截了请求,或是使用的网络环境是内网环境导致。
功能支持类 faq
q:小程序只支持 https 域名配置吗?
a:小程序只支持 https 域名配置。
相比于 http,https 可以提供更加优质保密的信息,保证了用户数据的安全性,此外 https 同时也一定程度上保护了服务端,使用恶意攻击和伪装数据的成本大幅提高。
因此小程序强制使用 https,还在使用 http 协议的开发者需要尽快对服务器进行升级。
q:my.request 是否支持 ip 地址请求?是否支持 ipv6 域名?
a:
- 安卓 10.3.50 开始支持 ip 地址请求,ios 10.3.76 开始支持 ip 地址请求,ide 暂不支持。在开发阶段,您可以勾选小程序开发者工具右上角 详情 > 域名信息 > 忽略 http 请求域名合法性检查,以使用本地局域网 ip 进行调试。
- 支付宝客户端 10.2.30 或更高版本,my.request 支持 ipv6 域名。
- my.request 不建议使用关于 127.0.0.1 的测试请求。
q:my.request 支持 promise 风格调用吗?
a:支持。样例: my.request({url: ''}).then(res => console.log(res)).catch(err => console.log(err))
q:小程序是否支持 cookie?
a: my.request 默认支持 cookie,但在 android 上有较小概率会发生丢失,不建议使用。强依赖 cookie 的情况下,可从 response headers 读取 set-cookie
字段,在下次请求时通过入参 headers 手工设置 cookie(注意:必须同时设置入参 enablecookie 为 true)。
q:是否可以本地测试小程序请求服务端呢?
a:可以
q:my.request 可以同步执行吗?
a:my.request 是异步执行的,无法同步执行。
q:小程序网络请求支持设置 http referer 吗?
a:
小程序会自带 http referer,暂时不支持自定义设置 http referer。
客户端 10.3.50 ,referer 可以通过 referrerstrategy 参数进行格式控制。
q:my.request 与 my.httprequest 的区别是什么呢?
a:
- my.request 是 my.httprequest 的升级优化,都是小程序端与服务器端交互发起网络请求,体验上没有大的区别。
- 支付宝客户端已不再维护 my.httprequest,建议使用 my.request。另外,钉钉客户端尚不支持 my.request。若在钉钉客户端开发小程序,则需要使用 my.httprequest。
- my.httprequest 的请求头默认值为 {'content-type': 'application/x-www-form-urlencoded'}。my.request 的请求头默认值为 {'content-type': 'application/json'}。此外,请求头对象里面的 key 和 value 必须是 string 类型。
请求异常类 faq
q:my.request 为何显示请求失败,提示 "error":2 入参有误?
- 请检查 url 是否合法。
- 请检查各个入参的类型是否正确。
q:my.request 请求报错 {"error":4, "errormessage": "未配置域名白名单..."},如何处理?
a:
- 请检查请求域名是否添加了域名白名单。查看如何配置
- request 请求的地址域名可能写错,导致跟配置的请求白名单域名不一致,请仔细检查。
- 客户端 10.3.80 开始支持域名白名单实时生效,10.3.80 以下版本只对配置后的版本生效,请发布新版上架。
q:如何确定是否为证书问题?如何解决?
a:
打开url: ,输入需要检查的域名,若看到两个 missing 说明是证书链不完整,如图:
服务器需要追加部署以上缺失的2个证书链。
1)如果使用阿里云的服务器,可以参考:
2)非阿里云服务器需要联系相应的云服务器提供商或者相应的服务器运维工作人员。
q:my.request 请求报错 "error":12,如何处理?
a:
- 请检查网络环境是否正常,服务器是否稳定,url 地址在外网是否能正常请求。
- 请参照上文问答,检查证书链是否完整,证书是否过期。
q:my.request 请求报错 "error":13,请求超时,如何处理?
a:
- my.request 默认超时时间为 30s,上限为 120s,可根据实际业务情况使用 timeout 参数控制超时时间。
- 安卓端 10.3.80 以前,网络连接不上也可能会误报请求超时,请参照上文 "error":12 的方案进行检查。
q:my.request 请求报错 {"error":14, "errormessage": "json parse data error"},如何解决?
a:
1)请检查 datatype 的设置是否正确:
- datatype 为 json: 小程序框架对返回结果做 json.prase 操作时解析失败。请修改后台返回数据格式为 json。若服务端需要返回非 json 字符串,则需要把 my.request 的 datatype 参数设置成 text。
- datatype 为 text: 返回的内容格式不符。
- datatype 为 base64: 转换失败。
2)如果后端是 php 或 .net,可检查响应的内容中是否携带了 bom,清除 utf-8 bom 头 。
q:my.request 请求报错 "error":19,如何处理?
a:
- http 404、500、504 等异常错误。可打开 ide 调试器 > network 可以查看具体的错误信息,真机也可通过错误回调中的 status、data 字段查看具体的错误码和错误信息。
- ide 网络连接不上可能会报 19,请参照上文 "error":12 的方案进行检查。