|
微信小程序和服务器之间传数据,微信确实用的小程序靠是JSON。但你要是传输以为小程序内部页面跳转也靠JSON,那就理解偏了。数据 打开微信开发者工具,微信随便建个项目,小程序靠你会看到每个页面文件夹里躺着四个文件:`.wxml`、传输`.wxss`、数据`.js`、微信`.json`。小程序靠那个`.json`文件管的传输是页面标题、导航栏颜色、数据下拉刷新开关这类配置。微信它不参与业务数据传输,小程序靠更像是传输个“设置面板”。你改一下`navigationBarTitleText`,页面顶部文字就变了,这活儿跟数据交换没关系。 真正跑数据的是`wx.request`这个API。我写个登录功能,前端收集完用户手机号和验证码,用`wx.request`往后台接口发请求,`method`设为`POST`,`header`里写`'Content-Type': 'application/json'`,`data`直接丢一个对象过去。微信会自动把对象序列化成JSON字符串,塞进请求体。后端拿到后解析,再返回一段JSON,比如`{ "code":0,"data":{ "token":"abc123"}}`,前端拿到后`JSON.parse`一下就能用。 但你别以为JSON是唯一选择。小程序也支持`method: 'GET'`时把参数拼在URL上,那是query string格式,不是JSON。还有上传文件走的是`wx.uploadFile`,用的是`multipart/form-data`,跟JSON半毛钱关系没有。甚至有些老项目偷懒,后端返回纯文本或HTML片段,前端用`dataType: 'text'`也能接住——虽然这么做不地道,但确实能跑。 我再给你说个实际踩过的坑。有一次联调支付接口,后端同事返回的JSON里有个字段叫`order_info`,里面嵌套了多层对象。我直接用`res.data.order_info`去取值,结果控制台报`undefined`。查了半天才发现,微信的`wx.request`在`success`回调里拿到的`res.data`其实已经帮你解析好了——前提是服务器响应头里`Content-Type`标了`application/json`。那次后端把响应头写成了`text/plain`,微信就傻乎乎地把JSON当字符串返回了,我得自己`JSON.parse`一遍才能用。 所以你看,JSON在小程序里扮演的角色更像“约定俗成的信封”,而不是“唯一的传话筒”。它轻量、可读性好、解析成本低,几乎所有后端语言都原生支持,所以成了默认选择。但微信官方文档里从来没写过“必须用JSON”,它只是你调接口时最顺手的工具。 至于小程序内部页面之间传参,走的是`url`上的query参数,比如`wx.navigateTo({ url: '/pages/detail?id=123'})`,那个`id=123`是普通字符串拼接,不是JSON。你要是想传一个对象,得先`JSON.stringify`转成字符串再拼上去,到了下一个页面再`JSON.parse`接回来——这算是JSON在小程序里的另一个小用途,但本质还是“用字符串搬运数据”。 做个总结吧,虽然我讨厌总结,但这事儿得说透:小程序和服务器通信,JSON是主流格式,因为它简单、通用、调试方便。但微信没有把JSON焊死在协议里,你用XML、用纯文本、甚至用二进制流,只要前后端商量好,照样能传。JSON只是工具箱里最趁手的那把扳手,不是唯一的工具。 |