简体   繁体   中英

Azure API Management Policy(Rewrite URI policy)- Template and Query Parameters

I require some help on doing a rewrite uri policy. I was able to extract information from payload and change the initial request URL. Have extracted the insurer_id from body and passed it to my backend -> mybackend.com/api/relationship/deny/{insurer_id}

I was able to extract it and send it to my backend, I have a bit of a trouble formatting once the request has been posted

I have a current payload:

{
  "insurer_id": "22112",
  "insurer_name": "Steve Rogers",
  "status_code: [ " "Deny\",",
  ],
  "additionalComments": "This is a test"
}

This is my Current code:

<policies>
    <inbound>
        <base />
        <set-variable name="insurerId" value="@{
            var body = context.Request.Body.As<JObject>(true);
            return body["insurer_id"].Value<string>();
        }" />
        <set-variable name="status_code" value="@{
                return context.Request.Body.As<JObject>(preserveContent:true)["status_code"].ToString(Newtonsoft.Json.Formatting.None);
            }" />
        <rewrite-uri template="@("/api/relationship/deny/" + context.Variables.GetValueOrDefault<string>("insurerId") + "?denyReason=" + context.Variables.GetValueOrDefault<string>("status_code"))" copy-unmatched-params="false" />
        <set-backend-service base-url="https://testbackend.azure-api.net" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

What I am trying to achieve works, but when I do a post, the payload doesn't look what is to be expected.

Expected Payload:


{
  "insurer_id": "22112",
  "insurer_name": "Steve Rogers",
  "status_code": "Deny",
  "additionalComments": "This is a test"
}

Unformatted payload:

{
  "insurer_id": "22112",
  "insurer_name": "Steve Rogers",
  "status_code": "[\"Deny\"]",
  "additionalComments": "This is a test"
}

You have to read the first value of your JArray and assign it to the variable:

<set-variable name="status_code" value="@{
        var body = context.Request.Body.As<JObject>(true);
        var statusCode = body["status_code"] as JArray;
        if(statusCode != null && statusCode.Count > 0)
        {
            return statusCode.FirstOrDefault();
        }
        return null;
}" />

But therefore you have to fix your invalid JSON:

{
  "insurer_id": "22112",
  "insurer_name": "Steve Rogers",
  "status_code": [ "Deny"],
  "additionalComments": "This is a test"
}

A query string consists of a key-value pair:

https://example.com/over/there?name=ferret

name is the key
ferret is the value for it

In your example, there's no key:

? + denyReason=context.Variables.GetValueOrDefault<string>("status_code")
and also the ? is a string. So it has to be put between quotation marks.

Fixed with sample query-key status_code :

<rewrite-uri template="@("/api/relationship/deny/" + context.Variables.GetValueOrDefault<string>("insurerId") + "?statuscode=" + context.Variables.GetValueOrDefault<string>("status_code"))" copy-unmatched-params="false" />

Complete policy:

<policies>
    <inbound>
        <base />
        <set-variable name="insurerId" value="@{
            var body = context.Request.Body.As<JObject>(true);
            return body["insurer_id"].Value<string>();
        }" />
        <set-variable name="status_code" value="@{
                var body = context.Request.Body.As<JObject>(true);
                var statusCode = body["status_code"] as JArray;
                if(statusCode != null && statusCode.Count > 0)
                {
                    return statusCode.FirstOrDefault();
                }
                return null;
         }" />
        <rewrite-uri template="@("/api/relationship/deny/" + context.Variables.GetValueOrDefault<string>("insurerId") + "?statuscode=" + context.Variables.GetValueOrDefault<string>("status_code"))" copy-unmatched-params="false" />
        <set-backend-service base-url="https://testbackend.azure-api.net" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM