WSO2 EI中基于SQL数据库UserCode存在性的网页重定向失败问题
问题分析与解决方案
从你的日志可以看到,API的逻辑判断已正常工作(正确识别UserCode是否存在,进入对应分支并设置了302状态码和Location头),但重定向未生效,核心原因是HTTP头属性的作用域未正确设置,同时代码中存在两处潜在的空格问题,以下是具体修复步骤:
1. 修正HTTP头属性的作用域
WSO2 EI中,HTTP_SC和Location属于传输层(Transport)的HTTP头,必须设置scope="transport"才能被正确传递到客户端。原代码未指定作用域,导致这些头信息无法被客户端识别。
修改then和else分支中的属性设置:
<then> <log> <property name="Message" value="Name Exists Lets redirect"/> </log> <property name="HTTP_SC" value="302" scope="transport"/> <property name="Location" value="https://wso2.com/" scope="transport"/> </then> <else> <log> <property name="Message" value="Name Does Not Exist Lets redirect"/> </log> <property name="HTTP_SC" value="302" scope="transport"/> <property name="Location" value="https://www.youtube.com/" scope="transport"/> </else>
2. 修复DB Lookup中的空格问题
原代码存在两处不必要的空格,虽然当前日志显示查询正常,但可能引发潜在错误:
- 参数表达式中的空格:
get-property('uri.var.UserCode ')→ 改为get-property('uri.var.UserCode') - 结果列中的空格:
column="UserCode "→ 改为column="UserCode"
修正后的DB Lookup片段:
<dblookup> <connection> <pool> <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver> <url>jdbc:sqlserver://10.1.1.111\test;databaseName=UserDB</url> <user>admin</user> <password>admin</password> </pool> </connection> <statement> <sql>select UserCode from UserDB.dbo.Users where UserCode =?;</sql> <parameter expression="get-property('uri.var.UserCode')" type="CHAR"/> <result name="foundnr" column="UserCode"/> </statement> </dblookup>
3. 客户端配置检查
如果使用API测试工具(如Postman),需确保工具开启自动跟随重定向选项;浏览器通常会自动处理302重定向,无需额外配置。
完整修正后的API代码
<api xmlns="http://ws.apache.org/ns/synapse" name="DBLookupAPI" context="/dblookup"> <resource methods="GET" uri-template="/{UserCode}"> <inSequence> <log level="custom"> <property name="Value" expression="get-property('uri.var.UserCode')"/> </log> <dblookup> <connection> <pool> <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver> <url>jdbc:sqlserver://10.1.1.111\test;databaseName=UserDB</url> <user>admin</user> <password>admin</password> </pool> </connection> <statement> <sql>select UserCode from UserDB.dbo.Users where UserCode =?;</sql> <parameter expression="get-property('uri.var.UserCode')" type="CHAR"/> <result name="foundnr" column="UserCode"/> </statement> </dblookup> <log level="custom"> <property name="Value" expression="get-property('foundnr')"/> </log> <filter source="boolean(get-property('foundnr'))" regex="true"> <then> <log> <property name="Message" value="Name Exists Lets redirect"/> </log> <property name="HTTP_SC" value="302" scope="transport"/> <property name="Location" value="https://wso2.com/" scope="transport"/> </then> <else> <log> <property name="Message" value="Name Does Not Exist Lets redirect"/> </log> <property name="HTTP_SC" value="302" scope="transport"/> <property name="Location" value="https://www.youtube.com/" scope="transport"/> </else> </filter> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource> </api>
内容的提问来源于stack exchange,提问作者Kelisha Govender
相关产品推荐
相关产品推荐

