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>'"}]}}
我创建了一个命名变量,它的值低于它。
<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>
我能够得到预期的输出。