记一次钉钉小程序开发网络请求API dd.httpRequest 报400的坑

其实网上也有人遇到过这个问题,点击查看.这篇文章作者的解决办法是,将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,说请求参数有问题.

本文送给开发钉钉小程序踩坑的小伙伴.

你可能感兴趣的:(记一次钉钉小程序开发网络请求API dd.httpRequest 报400的坑)