小程序学习三(通过wx.request的原理 理解http请求)

当我们使用wx.request时,微信是做了什么操作?
之前一直以为他只是简单的转发了一下。比如在android中,基础库在拿到request的相关参数之后发送给android,android使用okhttp之类的框架去发起网络请求。
这时候有一个问题,微信是支持发送buffer数据的,但基础库与android的通信中无法使用buffer的数据类型,那微信是怎么做的呢?
仔细查看微信文档发现了data参数的描述为 :
最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String 。
都是字符串?那可以通过下面的方法将buffer转换为字符串发送过android

arrayBufferToString(buffer) {
    return String.fromCharCode.apply(null, new Uint8Array(buffer))
}

基础库这样处理之后发现没问题,而且后端收到的buffer保存为文件之后也可以正常打开。
仔细观察发现还是不对– 文件大小变了… 难受!
只能和sdk的同事沟通了,ios的同事通过拦截微信发出的请求发现微信发出的数据是base64。
真相大白!如果data是arraybuffer就将数据转换为base64然后发送给android和ios。
问题整理 :

  • 通过 arrayBufferToString 方式转换之后为什么文件会变大,而且某些场景下无法正确识别里面的内容,目前猜测是fromCharCode导致的,部分编码无法做到与用户的编码完全一致,存在填充的情况。
  • 为什么发给sdk的是字符串 后端依然可以收到文件? 仔细想一下http请求,其实在很多程序员的认知中,调用某个请求的api,传递一些参数比如data、method、header,一次正常的请求就完成了。但其实这个api内部是怎么做的呢? 拿到程序员传递的参数将其转换为:请求方法URI协议/版本、请求头、正文,转换之后的格式不可能是对象或者buffer什么的吧,因为这种数据肯定是无法发送过后端的。那就是二进制数据,这时候就可以说通了,因为最终都会被接口转换为二进制数据,比如我们将信息(Accept、User-Agent、Accept-Language、Connection)等都添加到data参数中并统一格式化为http需要的格式,那请求依然可以正常发送。
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!