关于H5与小程序路由参数的那些事儿

1,044 阅读2分钟

最近做的一个微信公众号里面,需要与后端联调做微信与支付宝静默授权,先通过判断路由参数是不是从后端重定向过来的链接,再请求后端接口。直接看代码:

arrUrl 是一个切割过来的路由地址集合; 直接这样请求 在安卓机上是没问题的,但是在ios上这样传参,后端接收到的frontUrlPre 和frontUrlSuf 这两个参数中均带有一连串的 amp 这种符号 。

想了一下 应该是ios这种手机对一些路由参数信息可能比较敏感,加了一些标识符,刚开始对 arrUrl[0]和arrUrl[1],做了encodeURI 处理 后端再decodeURI 解析回来,发现还是带有 amp 这玩意儿,然后认真看了下 encodeURI 对特殊含义的符号 “; / ? : @ & = + $ , # ” 这些是不会编码处理的,而我的两个参数中可能带有一些这样的特殊字符,所以后面用 encodeURIComponent()试了下,

它与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
这些特殊符号能够在encodeURIComponent被转义,
encodeURIComponent()相比encodeURI()在编码时要更加彻底。它的对应解码函数为decodeURIComponent()。

这样搞了下没问题了

同样在小程序路由传参的过程中,遇到一个问题,刚开始

 wx.navigateTo({
     url: '../refund/ticket-refund-reason?orderParam=' + JSON.stringify(orderParam)
});

orderParam 这里是一个对象 ,并且对象里面包含的参数还蛮多

然后我在下一个页面中通过JSON.parse(options.orderParam) 赋值给初始化对象的时候,发现有些值丢失,根本没法赋值成功, 报错信息:

Unexpected end of JSON input;at pages/moment_detail/moment_detail page lifeCycleMethod onLoad function
SyntaxError: Unexpected end of JSON input

研究了下 原因是:

JSON.parse无法识别某些url或者消息内容中的特殊字符,所以报错

最后的解决办法是:

在JSON.stringify()之后将变量使用encodeURIComponent函数处理,encodeURIComponent()
函数可把字符串作为 URI 组件进行编码。在目标页面接收时用decodeURIComponent对URI
组件进行解码,后通过JSON.parse()将变量还原。
  wx.navigateTo({
   url: '../refund/ticket-refund-reason?orderParam=' + encodeURIComponent(JSON.stringify(orderParam))
   });

然后在接收页面:

onLoad: function (options) { 
	var parmas = decodeURIComponent((options.orderParam));
	console.log(JSON.parse(parmas));
},

总结一点就是:前端在传递一些参数的时候如果出现一些参数丢失问题,或者出现接收参数报错的时候,试着对相关参数做编码处理,有些问题莫名不知所措的时候,可以先打印出来看下。