小程序的坑 (一) request 请求方法为POST,服务器端拿不到数据

微信小程序的 wx.re­quest 请求,method 设为 POST 并向后台传递数据,但从后台返回的信息来看后台并没有获得传递的数据

wx.request({
      url: url, //仅为示例,并非真实的接口地址
      data: params,
      method: 'POST',
      header: {
        'content-type': 'application/json' // 默认值
      },
      success: function(res) {
        options.onSuccess(res)
      },
      fail: function(res) {
        options.onError(res)
      }
})

用的 CI 框架,框架内部封装了获取 $_GET 和 $_POST 全局变量的方法,一开始怀疑是不是参数不符合标准,然后被内部过滤掉了。
本地测试:
GET 请求 ok,本地用 ajax POST 数据也能拿到,所以排除框架自身原因,百度了一下,其他博客里强调的都是同一件事,看小程序的文档。
小程序的 wx.re­quest 是针对 ajax 的一种封装,封装之后是有些特性变化的。

data 数据说明:

最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String 。转换规则如下:

对于 GET 方法的数据,会将数据转换成 query string(encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...)
对于 POST 方法且 header['content-type'] 为 application/json 的数据,会对数据进行 JSON 序列化
对于 POST 方法且 header['content-type'] 为 application/x-www-form-urlencoded 的数据,会将数据转换成 query string (encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...)

也就是说 POST 请求,服务器端是拿不到字段的,只能直接取 $_POST, 然后 JSON 解析出具体数据。
POST + application/x-www-form-urlencoded 作为正常的表单提交数据,被改成了 GET 方法提交。。。

好吧,不服不行!

也提醒自己一点:

一定要看清楚文档,文档很重要!

posted @ 2019-11-21 15:03  海滨擎蟹  阅读(1194)  评论(0编辑  收藏  举报