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

问题描述 投票:0回答:1

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
1个回答
0
投票

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

<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

© www.soinside.com 2019 - 2024. All rights reserved.