如何在WSO2 Integration Studio中将API的HTML响应存入属性?
WSO2 Integration Studio捕获HTML响应并存入属性问题
我正在开发WSO2 Integration Studio项目,需要调用一个返回HTML响应的外部API,希望将该响应存入属性以便后续流程(如日志记录或处理)使用。
当前配置
<resource methods="GET" uri-template="/currentsession"> <inSequence> <call> <endpoint> <http method="get" uri-template="http://example.com/api"> <suspendOnFailure> <initialDuration>-1</initialDuration> <progressionFactor>-1</progressionFactor> <maximumDuration>0</maximumDuration> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> </markForSuspension> <authentication> <basicAuth> <username>test</username> <password>test</password> </basicAuth> </authentication> </http> </endpoint> </call> <!-- Attempt to save response --> <property name="response" scope="default" type="STRING" expression="$ctx:ORIGINAL_MESSAGE"/> <!-- Logging the saved property --> <log> <property expression="get-property('response')" name="tt"/> </log> <respond/> </inSequence> <outSequence/> <faultSequence/> </resource>
但当前配置未能按预期将实际HTML响应存入response属性,日志显示该属性为空或null。
已尝试的操作
- 使用不同的属性表达式:
$ctx:ORIGINAL_MESSAGE$ctx:messageBody$ctx:axis2_message_body$body
- 将
<property>中介移至<inSequence>内的不同位置,检查<call>后的响应上下文是否变化。 - 验证API响应为HTML格式(
Content-Type: text/html),且手动访问时能正确返回内容。
疑问
- 如何正确捕获
<call>中介返回的HTML响应体并将其存入属性? $ctx:ORIGINAL_MESSAGE是否适用于该场景?若不适用,应使用什么表达式?- 是否需要显式转换或缓冲负载才能通过属性访问它?
解决方案
1. 正确捕获HTML响应体到属性
针对HTML这类非XML/JSON的文本响应,需要让WSO2将其当作纯文本处理,避免自动解析导致的负载丢失,有两种可靠方式:
方式一:通过轴2属性指定处理规则
在<call>之前添加两个轴2属性,禁用分块并指定内容类型为纯文本:
<property name="DISABLE_CHUNKING" value="true" scope="axis2"/> <property name="ContentType" value="text/plain" scope="axis2"/>
然后在<call>之后,使用$body表达式将响应体存入属性:
<property name="response" scope="default" type="STRING" expression="$body"/>
方式二:直接读取原始响应数据
直接读取轴2的RESPONSE_DATA属性,它保存了HTTP响应的原始内容,无需额外配置:
<property name="response" scope="default" type="STRING" expression="get-property('axis2', 'RESPONSE_DATA')"/>
2. $ctx:ORIGINAL_MESSAGE的适用性
$ctx:ORIGINAL_MESSAGE存储的是初始请求的原始消息,和<call>返回的响应完全无关,因此这个表达式不适用于当前场景。你需要使用针对响应体的表达式,比如上面提到的$body或get-property('axis2', 'RESPONSE_DATA')。
3. 显式转换/缓冲负载的必要性
是的,对于HTML这类非结构化文本负载,WSO2默认不会将其解析到消息上下文的$body中(或者会尝试按XML解析导致失败),因此需要显式配置:
- 要么通过设置
ContentType轴2属性,告诉WSO2将响应当作纯文本处理; - 要么使用
<payloadFactory>将响应包装为字符串,确保负载被正确缓冲:
<payloadFactory media-type="text"> <format>$1</format> <args> <arg evaluator="xml" expression="$body"/> </args> </payloadFactory>
完成后再将$body存入属性即可。
内容的提问来源于stack exchange,提问作者Oussama Nairi
相关产品推荐
相关产品推荐

