APIM 入站策略 - 使用 Set-Body 在根级别追加包含子元素的 XML 元素

APIM Inbound Policy - Use Set-Body to append an XML element containing child elements at the root level

提问人:Oisín Tarrant 提问时间:11/11/2023 最后编辑:Oisín Tarrant 更新时间:11/13/2023 访问量:38

问:

UPS 的 API 要求在名为 AccessRequest 的元素中接收的请求正文中提供凭据。 通过 Azure API 管理,我需要将其与现有正文内容 (TrackingRequest) 一起注入入站策略。 我可以将完整的 AccessRequest 内容保存在 Azure Key Vault 中,并使用 {{AccessRequest}} 一次性注入它。

这是我想发布到他们的 API 的示例。

<AccessRequest>
    <AccessLicenseNumber>xxxxxxxxxxxxx</AccessLicenseNumber>
    <UserId>xxxxxxxxxxxxx</UserId>
    <Password>xxxxxxxxxxxxx</Password>
</AccessRequest>
<TrackRequest>
    <Request>
        <TransactionReference>
            <CustomerContext>Your Test Case Summary Description</CustomerContext>
        </TransactionReference>
        <RequestAction>Track</RequestAction>
        <RequestOption>activity</RequestOption>
    </Request>
    <TrackingNumber>1Z6xxxxxxxxxxxxx</TrackingNumber>
</TrackRequest>

我的尝试.....

<set-body>@{ 
var requestBody = context.Request.Body.As<JObject>(preserveContent: true);
requestBody [\"Content-Type\"] = \"application/xml\";
requestBody.Append(\"{{AccessRequest}}\");
return requestBody.ToString();
}</set-body>

希望这能起作用,但它失败了

Content:
{"error":{"code":"ValidationError","message":"One or more fields 
contain incorrect values:","details": 
[{"code":"ValidationError","target":"set-body","message":"Error in 
element 'set-body' on line 3, column 38: 'JObject' does not contain 
a definition for 'Append' and the best extension method overload 
'Enumerable.Append<string>(IEnumerable<string>, string)' requires a 
receiver of type 'IEnumerable<string>'"}]}}
xml azure-api-management apim

评论

0赞 jdweng 11/11/2023
你知道HTTP标头和正文数据之间的区别吗?您想要发送 XML,但您的代码正在创建一个 JSON 对象。
0赞 Oisín Tarrant 11/14/2023
希望使用 JObject 来编辑内容,并且出于某种原因认为强制 Content-Type 为 xml 会将其转换为 xml。

答:

0赞 Ikhtesam Afrin 11/13/2023 #1

我创建了一个命名变量,其中的值低于此值。

<AccessRequest>
   <AccessLicenseNumber>xxxxxxxxxxxxx</AccessLicenseNumber>
    <UserId>xxxxxxxxxxxxx</UserId>
    <Password>xxxxxxxxxxxxx</Password>
</AccessRequest>

我正在使用以下给定策略在 TrackRequest 的现有正文内容顶部添加 AccessRequest 元素。

<inbound>
    <base  />
    <set-variable  name="accessRequest"  value="{{AccessRequest}}"  />
    <set-body>@{
        var trackRequest = context.Request.Body.As<string>(preserveContent: true);
        var accessRequest = context.Variables.GetValueOrDefault<string>("accessRequest");
        var mergedRequest = $@"{accessRequest}{trackRequest}";
        return mergedRequest;
    }</set-body>
    <set-header  name="Content-Type"  exists-action="override">
        <value>application/xml</value>
    </set-header>
</inbound>

我能够获得预期的输出。

enter image description here enter image description here enter image description here

评论

0赞 Oisín Tarrant 11/14/2023
正是我需要的!谢谢。关于在哪里可以找到有关此主题的信息的任何建议?