我使用的外部API返回有效载荷为:
<code>202</code>
<message>Accepted</message>
错误响应的一个例子是:
<code>401</code>
<message>Unauthorized</message>
问题是这个XML没有父标记。因此,如果出现错误,则表达式error.MuleMessage
抛出错误,因为这是一个无效的XML。
谁能给我任何关于如何使用这个响应有效载荷的想法?
提前感谢!
输入不是有效的XML。你只是不能使用任何XML解析器或功能来处理它。
理想的解决方案是说服该API的维护者它应该返回有效的XML。
一个非常粗糙的替代方法是添加一些顶部元素,将其视为字符串并将其连接起来。这是一个hack,不是一个推荐的方法,但是如果你没有任何替代方法:
%dw 2.0
output application/json
var s = "<code>202</code><message>Accepted</message>"
var x = read("<root>" ++ s ++ "</root>", "application/xml") // not recommended
---
x.root.code
您需要在HTTP请求操作中将此输入视为文本/纯文本而不是XML,然后构建有效的XML。要做到这一点,将HTTP请求MIME类型设置为'text/plain'。
在本例中,将根标记连接到文本输入将创建一个String,该String可读为"application/xml"。一旦作为对象读取,根标记就可以被删除或以其他方式作为DW对象处理。
虽然这是一个"黑客",但错误在于源API没有在有效负载中返回有效的XML。
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" >
<http:listener-connection host="0.0.0.0" port="8081" />
</http:listener-config>
<flow name="naughtyApi" >
<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="api" outputMimeType="text/plain"/>
<set-payload value='#[output text/plain --- "<code>401</code><message>Unauthorized</message>"]' doc:name="Set Payload" mimeType="application/xml"/>
</flow>
<flow name="invokeNaughtyApi" >
<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="test"/>
<http:request method="GET" doc:name="Request" url="http://localhost:8081/api" outputMimeType="text/plain">
<http:body ><![CDATA[#["null"]]]></http:body>
</http:request>
<set-payload value='#[output application/json --- read("<root>" ++ payload as String ++ "</root>", "application/xml").root]' doc:name="Set Payload" />
</flow>
</mule>