提问人:Oisín Tarrant 提问时间:11/11/2023 最后编辑:Oisín Tarrant 更新时间:11/13/2023 访问量:38
APIM 入站策略 - 使用 Set-Body 在根级别追加包含子元素的 XML 元素
APIM Inbound Policy - Use Set-Body to append an XML element containing child elements at the root level
问:
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>'"}]}}
答:
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>
我能够获得预期的输出。
评论
0赞
Oisín Tarrant
11/14/2023
正是我需要的!谢谢。关于在哪里可以找到有关此主题的信息的任何建议?
评论