美文网首页
记一次钉钉小程序开发网络请求API dd.httpRequest

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

作者: Bury丶冬天 | 来源:发表于2019-01-02 16:20 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/vjwzlqtx.html