小程序学习三(通过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需要的格式,那请求依然可以正常发送。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值