(本文档仅供参考)
问题现象:
在集成时需要拼接集成的链接,但是在通过拼接好的集成链接访问资源时发现直接访问报错或者是访问成功了之后发现参数未正常传递。
问题原因:
1、集成参数json。参数传递失败或访问异常大概率是未使用正确的参数传递方式导致的。以透视分析举例,其他资源基本一致。如下透视分析资源上有一个名为年的参数,年份参数有一个默认值2020,在集成到其他系统的时候需要打开资源的时候按照集成系统输入的年为准,则需要在请求链接中拼接资源的参数信息。
如从第三方系统传递年份参数2021的值到集成的即席查询中,则参数的json就需要写成:
参数示例1:[{name:"年",value:"2021",displayValue:"2021"}]
参数示例2(多参数时):[{name:"年",value:"2021",displayValue:"2021"},{name:"发货区域",value:"东北",displayValue:"东北"}]
name表示参数名、value是参数的真实值、displayValue表示显示值
2、集成参数拼接。在资源集成时主要使用openresource.jsp来进行集成,详细可参考:从第三方系统中打开Smartbi资源。openresource请求中存在两个参数:paramsInfo和paramsInfoBase64,拼接传递参数的时候需要将参数写长一个json串来拼接到这两个openresource的参数后面,两个参数适用于不同的场景。
paramsInfo:后面可以直接跟Json序列化之后的对象,也就是使用JSON.stringify()之后的结果,如下:paramsInfo=[{"name":"年","value":"2021","displayValue":"2021"}]
paramsInfoBase64:paramsInfo仅支持整个json没有中文的时候时候,因为浏览器在识别请求时会将中文转换为编码,就会导致服务器无法识别然后出现报错。而需要中文时就需要将参数先通过Base64转码才可正常传递。
注意:使用Base64转码的时候一定需要使用UTF-8的字符编码进行转换,否则无法识别。
使用base64转码时最好使用java类:sun.misc.BASE64Decoder()方法进行转码,参考的示例如下
另外还可以使用js的转码方式,参考下图。注意使用js转码有概率会出现js转码后java解码时失败的情况。
3、特殊字符url转码。参数拼接后的请求如果直接访问还是有可能会参数传递失败的问题,主要原因是在参数串中可能存在特殊字符,特殊字符在浏览器中是无法识别的。需要对参数串url转码之后再拼接url,可以使用ecodeURLComponent() 方法进行转码。
如下base64串里的等于号会被转为:%3D