Обработка (чтение) файлов в кодировке Base64 в приложении логики и отправка в конечную точку

У меня есть приложение логики, которое получает содержимое от SharePoint (.xlsx) и отправляет тело в конечную точку для обработки. теперь содержимое, которое я вижу, является файлом в кодировке base64, и я хотел опубликовать эти данные как есть.

когда я пытаюсь опубликовать его с помощью почтальона, он успешно принимается, но когда он публикуется из приложения логики, я получаю

BadRequest. Http-запрос не выполнен: содержимое не является допустимым JSON.

но я вижу, что тело, которое должно было быть отправлено, имеет тип, который является действительным Json

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

также попробовал это выражение

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

но я получаю другую ошибку

InvalidTemplate. Невозможно обработать выражения языка шаблона в входных данных "HTTP" действия в строке "1" и столбце "2565": "Выражение языка шаблона" decodeBase64(triggerBody()?[Body('getFile')]) "не может быть оценено, поскольку свойство '{ "$content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "$content": "UEsDBBQABgAIAAAAIQDuooLHjAEAAJkGAAATAAgCW0Nvb...

То, чего я хочу добиться - это просто, я хочу опубликовать в своей конечной точке Json как есть или содержимое строки base64Encoded.

1 ответ

Можете ли вы отправить мне запрос почтальона, сохраните его в сборке, а затем экспортируйте как файл. Я думаю, что то, что вы можете делать в почтальоне, можно сделать и в приложении логики. Или пришлите мне свой код, я могу его изменить. Убедитесь, что у вас есть сообщение в теле и оно соответствует параметру сообщения на уровне веб-API.

 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); }
               });

Посмотрев на ваше заявление:

Logic App получает содержимое из SharePoint (.xlsx) и отправляет тело в конечную точку для обработки. теперь содержимое, которое я вижу, является файлом в кодировке base64

Я предполагаю, что ваша конечная точка все еще ищет тип контента -
vnd.openxmlformats-officedocument.spreadsheetml.sheet,
но вы передаете строку Base64

1) проверьте, правильно ли размещен заголовок "content-type", измените его на application/json, если возможно
2) Убедитесь, что вы правильно обрабатываете строку base64.

В моем случае я извлек строку base64 из файла изображения с помощью Javascript. У меня есть специальные ключи в начале строки base64, такие как "data:image/png;base64","ACTUAL BASE 64 STRING...", поэтому я удалил специальные ключи перед фактической строкой base64 с некоторым регулярным выражением. Этот образец запроса Json может помочь в прикреплении содержимого base64

Убедитесь, что вы конвертируете свой запрос в JSON с помощью 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
                    }
                  ]
              }
            ]
          });

Я использовал XMLHttpRequest:

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
        }

Если вы расшифруете контент с помощью base64, вы обнаружите, что он искажен. Это потому, что содержимое в формате ooxml затем кодируется с помощью base64. И в приложении логики вы не можете расшифровать ooxml.

Первое решение: вы можете использовать функцию Azure, чтобы написать метод для чтения документа, а затем вернуть содержимое. Затем в приложении логики вызовите функцию для получения контента.

Второе решение, измените ваш файл на файл, который можно прочитать напрямую (например, файл.txt), так я попробовал, и вы можете разобрать его, Json.

Другие вопросы по тегам