如何从 Mule 中的 ApiKit 映射中检索 statusCode

How to retrieve statusCode from ApiKit mapping in Mule

我们希望在我们的异常策略中使用相同的进程处理我们捕获的所有异常。是apikit生成的。我们首先使用自定义组件发送大量内容,然后生成 json 响应。在 DataWeave 的响应中,我们想要设置相同的状态代码。但是,statusCode 似乎不是可检索的变量。我说的对吗,或者有什么好的方法可以找回它?

    <apikit:mapping-exception-strategy xmlns:apikit="http://www.mulesoft.org/schema/mule/apikit" name="svc0031_hotel-apiKitGlobalExceptionMapping">
         <apikit:mapping statusCode="504">
            <apikit:exception value="org.mule.api.transformer.TransformerMessagingException"/>
            <flow-ref name="svc0031_manageErrors" doc:name="Manage Error"/>
        </apikit:mapping>
  <apikit:mapping statusCode="404">
            <apikit:exception value="org.mule.api.transformer.TransformerMessagingException"/>
            <flow-ref name="svc0031_manageErrors" doc:name="Manage Error"/>
        </apikit:mapping>
    </apikit:mapping-exception-strategy>
    <sub-flow name="svc0031_manageErrors">
        <set-payload value="#[groovy:message.exceptionPayload.rootException.message]" doc:name="Set BIP Payload"/>
        <custom-transformer class="se.zystems.baseline.BaselineLogging" doc:name="Log BIP Outgoing">
            <spring:property name="Level" value="ERROR"/>
            <spring:property name="ObjectId" value="CatchErrors"/>
            <spring:property name="TransactionStatus" value="failed"/>
        </custom-transformer>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{ 
  status : 400,
  message : payload,
  code : 42,
  more_info :"https://anypoint.mulesoft.com/apiplatform/nordic-choice-hotels"
}]]></dw:set-payload>
        </dw:transform-message>
        <logger level="INFO" doc:name="Logger"/>
    </sub-flow>

很好,

如果您使用 http.status 创建一个变量,那么您可以在映射器中使用它:

 <flow name="test">
        <set-variable variableName="httpStatus" value="#[message.inboundProperties['http.status']" doc:name="Variable"/>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json

---
{ 
  status : flowVars.httpStatus,
  message : payload,
  code : 42,
  more_info :"https://anypoint.mulesoft.com/apiplatform/nordic-choice-hotels"
}]]></dw:set-payload>
        </dw:transform-message>
    </flow>

A​​PIKitExceptionStrategy 中定义的状态代码将是那些在响应 header 中作为 http.status 发回的代码,因为要引发相应的异常。 例如,

<apikit:mapping statusCode="504">
        <apikit:exception value="org.mule.api.transformer.TransformerMessagingException"/>
        <flow-ref name="svc0031_manageErrors" doc:name="Manage Error"/>
    </apikit:mapping>

表示当一个org.mule.api.transformer.TransformerMessagingException异常被这个异常块抛出并捕获时,然后返回一个504状态码作为响应header . 如果你想绕过 APIKit 异常块中的 statusCode 属性,你应该有另一个 exceptionStrategy 块来捕获你想要的异常,然后你可以像那样设置你的状态代码

<set-property name="http.status" value="<the_desired_status, e.g. 401>" />

希望对您有所帮助。

/托尼

感谢 Jesús Pablo Fernández

的回答,我找到了 statusCode 值的存储位置

他的回答几乎是正确的,但是,statusCode 不是存储在 message.inboundProperties['http.status'] 中,而是存储在 message.outboundProperties['http.status'] 中。甚至不需要提取变量,可以像这样直接在数据转换器中访问它:

        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{ 
  status : outboundProperties['http.status'],
  message : payload,
  code : 42,
  more_info :"https://anypoint.mulesoft.com/apiplatform/nordic-choice-hotels"
}]]></dw:set-payload>
        </dw:transform-message>

好的斯坦尼斯拉夫·伊万诺夫,

我有一个使用 APIKit 实现的流程,这是我附加的代码以及 inboundProperties 中是否有 属性 http.status,检查它,因为它是否应该包含值,如果您没有流程可以修改上一步中的值。

我指点他直接访问映射器中的outboundProperties,我没有意识到,非常感谢。