Azure APIM Policies Transforming Body of Payload

Viewed 39

I am still currently exploring in APIM. I have a payload in payload #1, which I want to transform into another payload # 2(expected).
How would I edit my policy to construct this pay load?

Payload 1

{
    "dependtee_name": "Steve",
    "depdentee_last_name": "Rogers",
    "dependtee_comment" : "This is test",
    "file": "file.txt",
    "file_type": "text file",
    "insurer_name": "Steve",
    "insurer_last_name": "Rogers",
    "insurer_comment" : "This is test",
    "extra_info": "This is comments"
}

Payload 2 - Expected

{
  "dependtee_info": {
    "name": "Steve",
    "last_name": "Rogers"

  },

  "file_details": {
    "all_file": [ "file.txt", "null" ],
    "fileFormat": "text file"
  },

  "insurer_info": {
    "i_name": "Tony",
    "i_last_name": "Stark"
  },
  "extra_info": "This is comments"
}

Current Code

<policies>
    <inbound>
        <base />
        <return-response>
            <set-status code="200" reason="ok" />
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@{
                var body = context.Request.Body.As<JObject>(true);

                var transformedBody = new JObject();
                transformedBody["extra_info"] = body["extra_info"];
                

                var dependentee= new JObject();
                dependetee["name"] = body["dependtee_name"];
                dependentee["lastName"] = body["depdentee_last_name"];
                transformedBody["dependtee_info"] = dependentee;

        

                var file_details = new JObject();
                dependentee["all_file"] = body["file"];
                dependentee["fileFormat"] = body["file_type"];
                transformedBody["file_details"] = file_details;

               var insurer_info = new JObject();
                dependetee["i_name"] = body["insurer_name"];
                dependentee["i_last_name"] = body["insurer_last_name"];
                transformedBody["insurer_info"] = insurer_info;

                return transformedBody.ToString();               
            }</set-body>
        </return-response>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Looking to change the body specifically for the file.
I want to know how I can add those square brackets in my expected payload.
Payload 2 should have more than one value for key "all_file", but I want to be able to get it from Payload 1.

Thank you for your help

1 Answers

You have to create a JArray and Add the strings and assign the JArray to the parent object:

var file_details = new JObject();
var all_File = new JArray();
all_File.Add(body["extra_info"]);
all_File.Add("null"); // does not makes sense to a null string
file_details["all_file"] = all_File;
file_details["fileFormat"] = body["file_type"];
transformedBody["file_details"] = file_details;

I do not understand the purpose of "null" in Payload 2 - Expected:
"all_file": [ "file.txt", "null" ], Where does it comes from? And why is it a string "null" and not null?

Here's complete fixed policy:

<policies>
    <inbound>
        <base />
        <return-response>
            <set-status code="200" reason="ok" />
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@{
                var body = context.Request.Body.As<JObject>(true);

                var transformedBody = new JObject();
                transformedBody["extra_info"] = body["extra_info"];
                

                var dependentee= new JObject();
                dependentee["name"] = body["dependtee_name"];
                dependentee["lastName"] = body["depdentee_last_name"];
                transformedBody["dependtee_info"] = dependentee;

                var file_details = new JObject();
                var all_File = new JArray();
                all_File.Add(body["extra_info"]);
                all_File.Add("null"); // does not makes sense to use a null string
                file_details["all_file"] = all_File;
                file_details["fileFormat"] = body["file_type"];
                transformedBody["file_details"] = file_details;

                var insurer_info = new JObject();
                insurer_info["i_name"] = body["insurer_name"];
                insurer_info["i_last_name"] = body["insurer_last_name"];
                transformedBody["insurer_info"] = insurer_info;

                return transformedBody.ToString();               
            }</set-body>
        </return-response>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Result:
enter image description here

Related