Ipkiss
Ipkiss

Reputation: 811

Handling (read) of Base64 encoded files in a Logic App, and post to endpoint

I have a Logic App that gets the contents from a SharePoint (.xlsx) and posts the body to an endpoint to get processed. now the content I see is a base64-encoded file, what I wanted to do was to post this data as is.

when I try to post it using postman it gets accepted successfully but when it is posted form the Logic app I get

BadRequest. Http request failed: the content was not a valid JSON.

but I can see that the body that was meant to be sent is of the type, which is a valid Json

{
  "$content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  "$content": "AA....VeryLong...B1241BACDFA=="
}

also tried this expression

decodeBase64(triggerBody()?[body('getFile')])

but I get a different error

InvalidTemplate. Unable to process template language expressions in action 'HTTP' inputs at line '1' and column '2565': 'The template language expression 'decodeBase64(triggerBody()?[body('getFile')])' cannot be evaluated because property '{ "$content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "$content": "UEsDBBQABgAIAAAAIQDuooLHjAEAAJkGAAATAAgCW0Nvb...

What I want to achieve is simple really I want to post to my end point the Json as is or the contents of the base64Encoded string.

Upvotes: 3

Views: 6985

Answers (3)

Ajay Venkata Raju
Ajay Venkata Raju

Reputation: 1168

after looking at your statement:

Logic App gets the contents from a SharePoint (.xlsx) and posts the body to an endpoint to get processed. now the content I see is a base64-encoded file

i assume your endpoint is still looking for a content type -
vnd.openxmlformats-officedocument.spreadsheetml.sheet
but you are passing a Base64 String

1) check if your "content-type" header is correctly placed change it to application/json if possible
2) Make sure you are processing the base64 string correctly.

In my case, I extracted the base64 string from an image file using Javascript. I got special keys at the start of base64 string like ''data:image/png;base64','ACTUAL BASE 64 STRING...' so i removed the special keys before the actual base64 string with some regular expression. This sample Json request might help in attaching the base64 Content

Make sure you are converting your request to JSON using JSON.stringify

          //var finalString = srcData.replace('data:image/png;base64,','');  
          var finalString = srcData.replace(/^,+?(\,)/, ''); 
          finalString = srcData.substring(srcData.indexOf(',')+1, srcData.length);
          var data = JSON.stringify({
            "requests": [
                {
                  "image": {
                    "content": finalString
                  },
                  "features": 
                  [
                    {
                      "type": "DOCUMENT_TEXT_DETECTION",
                      "maxResults": 1
                    }
                  ]
              }
            ]
          });

This is the XMLHttpRequest i used:

var xhr = new XMLHttpRequest();
        xhr.withCredentials = true;
        xhr.addEventListener("readystatechange", function () {
          if (this.readyState === 4) {
            console.log(this.responseText);
            var obj = JSON.parse(this.responseText);
            try 
            {
              //do something
            }catch(err) 
            {
            //do something
            }
          }

        });
        try {
        xhr.open("POST", "https://vision.googleapis.com/v1/images:annotate?key=blablabla");
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.setRequestHeader("cache-control", "no-cache");
        xhr.setRequestHeader("Postman-Token", "111111111");

        xhr.send(data);
        }
        catch(err) {
            //do something
        }

Upvotes: 1

Jin Thakur
Jin Thakur

Reputation: 2783

Can you send me your postman request save it in collect and then export as file. I think what you can do in postman can be done in logic app too. Or send me your code I can modify it.Make sure you have post as body and it matches the parameter of Post at web api level.

 var Webrequestdata = {
     "webserviceurl":  "http://examplecom/u/b/b/e.ee.msg",
   "username":  "123"
};



 $.ajax({
                   cache: false,
                   type: "POST",
                   url: 'http://example.com/res/api/Outlookapi',
                   data: JSON.stringify(Webrequestdata),
                   contentType: "application/json",
                   success: function (result) {
                       console.log("email sent  successfully");
                   },
                   error: function (response) { alert('Error: ' + response.responseText); }
               });

Upvotes: 1

George Chen
George Chen

Reputation: 14344

If you decode the content with base64 you will find the content is garbled. This is because the content is in ooxml format then encoded with base64. And in logic app you could not decode the ooxml.

First solution, you could use Azure Function to write a method to read the document then return the content. Then in logic app call the function to get the content.

Second solution, change your file to a directly readable file(like .txt file), this way I tried and you could parse it Json.

enter image description here

Upvotes: 1

Related Questions