其实网上也有人遇到过这个问题,点击查看.这篇文章作者的解决办法是,将json通过字符串以form表单的形式提交到后台,后台以form表单的方式接收,不过这样做有个问题,那就是后台开发人员已经完成了接口的开发,不可能所有的接口都给你改成form的方式,按你的请求方式来,所以基本不适用,下面请看我的解决方法,顺便提一下遇到的其他坑.
最近在给公司做钉钉小程序上的那个E应用,因为我的使用的开发框架是megalo,可以同时编译出微信小程序和阿里系列小程序(支付宝小程序,钉钉小程序,E应用等)的源码.
于是我对阿里的E应用的网络请求API跟微信小程序的网络请求API做了兼容处理,代码如下:
import urlConfig from './url-config.js'
function getSupportRequest(platform) {
if (platform === 'wechat') {
return wx.request
} else if (platform === 'alipay') {
try {
return dd.httpRequest
} catch (e) {
return my.httpRequest
}
}
}
/**
* 获取网络请求方法
* @param platform
* @returns {function(*, *=, *=, *=): Promise}
*/
export default function (platform) {
const supportRequest = getSupportRequest(platform)
return function (
url,
method = 'GET',
data = {},
header = {
'Content-Type': 'application/json'
// 'Content-Type': 'application/x-www-form-urlencoded'
}
) {
if (platform === 'alipay' && method !== 'GET') {
data = JSON.stringify(data)
}
// data.body = JSON.stringify(data)
return new Promise((resolve, reject) => {
supportRequest({
url: `${urlConfig.baseUrl}${url}`,
method,
data,
header,
// 这里的处理主要是为了兼容阿里系的请求
headers: header,
// 超时时间
timeout: 10000,
// 返回数据格式
dataType: 'json',
success(res) {
// 这里这步处理主要是为了兼容alipay
if (res.status) {
res.statusCode = res.status
}
resolve(res)
},
fail(error) {
// 这里的处理主要也是为了兼容alipay alipay小程序发生请求非200请求码会走fail
if (error.data) {
error.statusCode = error.status
resolve(error)
} else {
reject(error)
}
}
})
})
}
}
遇到的坑及解决办法:
- 1.微信小程序的网络请求API 请求头参数是header,钉钉小程序是headers,所以我两个参数都传了,这个其实不算坑,看一下文档就明白.
- 2.微信小程序在网络请求返回的参数中对http状态码保存在了statusCode这个变量中,而钉钉小程序对http的状态码保存在status这个变量中.
- 3.对于微信小程序提交JSON到后台,在data这个参数的地方是直接写 js 对象的,但是钉钉小程序需要将 js 对象通过 JSON.stringify 转成String对象再提交(注:GET请求无法提交JSON,所以data不能转成string,否则请求参数不会自动给你拼接到url后面去),后台才能接收到.
对于2 3两个坑我是吃了大亏的,特别是第三个坑,后台死活获取不到参数,但是在阿里提供的小程序开发者工具中预览没有问题,在手机的钉钉App中预览就无法将数据提交到服务器,服务器一直给我返回400,说请求参数有问题.
本文送给开发钉钉小程序踩坑的小伙伴.