IBM Cast Iron Studio URI拼接转义问题及XSLT实现咨询
解决URI拼接时&符号被误解析为参数分隔符的问题
这个问题的核心是String1中的&没有被转义,直接拼接后会被HTTP协议识别为新的查询参数分隔符,导致67890被当成一个无键的参数,进而引发请求失败。要实现你期望的输出,我们可以通过两种方式处理:
方式一:使用Studio的Replace函数直接转义
在拼接URI之前,先对String1中的&进行替换,把它转成&,再进行concat操作:
' 先处理String1,替换&为& Dim processedString1 As String = Replace(String1, "&", "&") ' 再拼接最终URI Dim finalUri As String = Concat("/api?invoice=", processedString1, "&supplier=", String2)
这样处理后,String1会变成12345&67890,拼接后的URI就是你想要的/api?invoice=12345&67890&supplier=78326832,服务器能正确识别invoice参数的完整值。
方式二:用XSLT转义&符号
当然可以用XSLT来实现符号到HTML实体的转换,你可以写一个递归模板来处理字符串中的所有&:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义转义&的模板 --> <xsl:template name="escape-ampersand"> <xsl:param name="input-string"/> <xsl:choose> <!-- 如果字符串里还有&,就截取前面的部分,输出&,再递归处理剩下的内容 --> <xsl:when test="contains($input-string, '&')"> <xsl:value-of select="substring-before($input-string, '&')"/> <xsl:text>&amp;</xsl:text> <xsl:call-template name="escape-ampersand"> <xsl:with-param name="input-string" select="substring-after($input-string, '&')"/> </xsl:call-template> </xsl:when> <!-- 没有&的话直接输出原字符串 --> <xsl:otherwise> <xsl:value-of select="$input-string"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- 调用模板的示例 --> <xsl:template match="/"> <xsl:variable name="processed-string1"> <xsl:call-template name="escape-ampersand"> <xsl:with-param name="input-string" select="'12345&67890'"/> </xsl:call-template> </xsl:variable> <!-- 拼接生成最终URI --> <xsl:value-of select="concat('/api?invoice=', $processed-string1, '&supplier=', '78326832')"/> </xsl:template> </xsl:stylesheet>
这个XSLT模板会递归遍历字符串,把所有的&替换成&,之后再拼接成目标URI即可。
本质上,这两种方式都是通过转义特殊字符,让HTTP服务器能够正确识别查询参数的边界,避免把参数值里的&当成新参数的分隔符。
内容的提问来源于stack exchange,提问作者sandeep kairamkonda
相关产品推荐
相关产品推荐

