You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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),且手动访问时能正确返回内容。

疑问

  1. 如何正确捕获<call>中介返回的HTML响应体并将其存入属性?
  2. $ctx:ORIGINAL_MESSAGE是否适用于该场景?若不适用,应使用什么表达式?
  3. 是否需要显式转换或缓冲负载才能通过属性访问它?

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:52:53