Azure API Management Set-Body with liquid 模板
Azure API Management Set-Body with liquid template
我有一个 SOAP 服务,在将请求发送到后端服务之前,我需要向 XML Body 添加一个 属性。
我的 Postman 请求如下:
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<gprnEnquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.somedomain.com">
<gprn>123456</gprn>
<registrationstatus>registrationstatus1</registrationstatus>
</gprnEnquiry>
</Body>
</Envelope>
我正在传递 Content-Type header 的 text/xml
我的 APIM 入站政策如下:
<set-body template="liquid">
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<gprnEnquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.somedomain.com">
<gprn>{{body.gprnEnquiry.gprn}}</gprn>
<registrationstatus>{{body.gprnEnquiry.registrationstatus}}</registrationstatus>
<authKey>{{My-NamedValue}}</authKey>
</gprnEnquiry>
</Body>
</Envelope>
</set-body>
通过在 APIM 中启用请求和响应 body 捕获,我可以看到来自请求的值正在传入,而响应没有任何值。
后端请求
<Envelope
xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<gprnEnquiry
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.somedomain.com">
<gprn></gprn>
<registrationstatus></registrationstatus>
<authKey>xxxxxxxxxxx</authKey>
</gprnEnquiry>
</Body>
</Envelope>
有人知道为什么源请求中的值没有被映射到后端请求吗?
好的,这里的答案取决于请求正文的格式以及 APIM 策略如何映射元素。通过在请求中包含 和 Envelope 节点,可以防止 Liquid 模板正确映射值。
此外,APIM 不允许您指定信封在请求正文中,例如 {{envelope.body.gprnEnquiry.gprn}}。
将请求正文更改为以下内容解决了问题:
<Body>
<gprnEnquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.somedomain.com">
<gprn>123456</gprn>
<registrationstatus></registrationstatus>
</gprnEnquiry>
</Body>
您的路径{{body.gprnEnquiry.gprn}}不正确。如果您使用这个示例 SOAP 消息,您的路径应该是:{{body.Envelope.Body.gprnEnquiry.gprn}} 因为 soap 主体不会自动链接。液体标签 'body' 代表您的完整请求。
我有一个 SOAP 服务,在将请求发送到后端服务之前,我需要向 XML Body 添加一个 属性。
我的 Postman 请求如下:
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<gprnEnquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.somedomain.com">
<gprn>123456</gprn>
<registrationstatus>registrationstatus1</registrationstatus>
</gprnEnquiry>
</Body>
</Envelope>
我正在传递 Content-Type header 的 text/xml
我的 APIM 入站政策如下:
<set-body template="liquid">
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<gprnEnquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.somedomain.com">
<gprn>{{body.gprnEnquiry.gprn}}</gprn>
<registrationstatus>{{body.gprnEnquiry.registrationstatus}}</registrationstatus>
<authKey>{{My-NamedValue}}</authKey>
</gprnEnquiry>
</Body>
</Envelope>
</set-body>
通过在 APIM 中启用请求和响应 body 捕获,我可以看到来自请求的值正在传入,而响应没有任何值。
后端请求
<Envelope
xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<gprnEnquiry
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.somedomain.com">
<gprn></gprn>
<registrationstatus></registrationstatus>
<authKey>xxxxxxxxxxx</authKey>
</gprnEnquiry>
</Body>
</Envelope>
有人知道为什么源请求中的值没有被映射到后端请求吗?
好的,这里的答案取决于请求正文的格式以及 APIM 策略如何映射元素。通过在请求中包含 和 Envelope 节点,可以防止 Liquid 模板正确映射值。
此外,APIM 不允许您指定信封在请求正文中,例如 {{envelope.body.gprnEnquiry.gprn}}。
将请求正文更改为以下内容解决了问题:
<Body>
<gprnEnquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.somedomain.com">
<gprn>123456</gprn>
<registrationstatus></registrationstatus>
</gprnEnquiry>
</Body>
您的路径{{body.gprnEnquiry.gprn}}不正确。如果您使用这个示例 SOAP 消息,您的路径应该是:{{body.Envelope.Body.gprnEnquiry.gprn}} 因为 soap 主体不会自动链接。液体标签 'body' 代表您的完整请求。