Отклик SOAP скрипта Google Apps закодирован.Как / где добавить base64decode, чтобы увидеть ответ в виде xml - PullRequest
0 голосов
/ 31 января 2019

Ниже приведен мой рабочий скрипт Google Apps SOAP API envelop call.Он работает, чтобы подключиться нормально, и, как вы можете видеть ниже, он возвращает ответ, но мой ответ закодирован.Как / где добавить немного, чтобы сделать Base64decode, чтобы увидеть XML, который возвращается вместо строки символов?Я совершенно новичок в SOAP API и все еще новичок в скриптах приложений.Спасибо!

function getData() { 
var webservice = ‘https://someplace.com/services/stuff/’;

var xml = '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://someurlhere.com">'
+   '<soapenv:Header/>'
+   '<soapenv:Body>'
+ '<ser:getReportXML soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> '
+    '<in0 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' +  userid + '</in0> '
+    '<in1 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' + password + '</in1> '
+    '<in2 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' + startDate + '</in2> '
+    '<in3 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' + endDate + '</in3> '
+ '</ser:getReportXML> '
+   '</soapenv:Body>'
+' </soapenv:Envelope>'

var options = {  
  headers: {"SOAPAction" :"https://someplace.com/services/stuff/"},
  method: "post",
  contentType: "text/xml",
  payload: xml,
  muteHttpExceptions: true,
};

var serviceaddress = webservice;
var response = UrlFetchApp.fetch(serviceaddress, options);
Logger.log(response);

};

Возвращает закодированную строку в ответе, но я хочу увидеть фактические результаты XML:



[19-01-31 11:46:02:122 PST] <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:getReportXMLResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1=" http://someurlhere.com "><getReportXMLReturn xsi:type="soapenc:base64Binary" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">WMui8xyxcPQXmZgSerdPd94bwWxGsAMgdmVyc2lvbj0iFRxlTSerdgiPz4NCg0KPQFET0NUW

Я пытаюсь получить вывод ответа, похожий наxml, а не строка символов

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE ETRANS PUBLIC "-//Something//ethings DTD//EN" "https://www.url.com/dtd/ethings_1_0.dtd">

<ETRANS>
<USER ID="AABB1122" USER_NAME="Smith, John" DATE="2019-02-01 09:41:45" DEPT_ID=""/>
</ETRANS>

Итак, я выяснил, что мой ответ имеет закодированное тело XML, но в нем также есть все эти дополнительные биты в ответе перед фактическими закодированными данными, поэтомуСбой декодера, так как он не знает, что делать с этим битом, показанным здесь в начале ответа

[19-01-31 11:46:02:122 PST] <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:getReportXMLResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1=" http://someurlhere.com "><getReportXMLReturn xsi:type="soapenc:base64Binary" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">

и еще несколькими битами внизу, которые похожи на некоторое закрытие вышеуказанных битов.Есть ли что-то, что мне нужно передать в моем запросе, чтобы запрос SOAP возвращал только символьную строку, а не эти дополнительные биты, которые выглядят так, будто они помещают «конверт» вокруг закодированных данных, которые он отправляет обратно?

1 Ответ

0 голосов
/ 08 февраля 2019

Я наконец понял это.Я не знаю, есть ли «лучший» способ сделать это, но если вы видите, что я сделал, возможно, вы могли бы поделиться этим «лучшим» способом.Поэтому я добавил строки "NEW BIT" ниже.Мне пришлось избавиться от SOAP Envelop, чтобы декодировать бит base64.Единственный способ, который я мог выяснить в Google Apps Script, - это сохранить ответ в виде файла, так как это «волшебным образом» убирало SOAP.Тогда мне нужно было получить оставшийся бит base64, который был в файле MyTestFile, который я создал, в текстовую строку и декодировать / преобразовать его, и он создал xml, который я искал.Я надеюсь, что это может помочь кому-то еще.

function getData() { 
    var webservice = ‘https://someplace.com/services/stuff/’;
    var newDocName = 'MyTestFile'

    var xml = '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://someurlhere.com">'
    +   '<soapenv:Header/>'
    +   '<soapenv:Body>'
    + '<ser:getReportXML soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> '
    +    '<in0 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' +  userid + '</in0> '
    +    '<in1 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' + password + '</in1> '
    +    '<in2 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' + startDate + '</in2> '
    +    '<in3 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">' + endDate + '</in3> '
    + '</ser:getReportXML> '
    +   '</soapenv:Body>'
    +' </soapenv:Envelope>'

    var options = {  
      headers: {"SOAPAction" :""},
      method: "post",
      contentType: "text/xml",
      payload: xml,
      muteHttpExceptions: true,
    };

    var serviceaddress = webservice;
    var response = UrlFetchApp.fetch(serviceaddress, options).getContentText();
    //Logger.log(response);

    //NEW BIT BEGINS HERE THAT DECODED THE RESPONSE

    var blob = DriveApp.createFile('dummy',response, 'text/html').getBlob();
    var resource = {
      title: newDocName,
      convert: true,
      mimeType: 'application/vnd.google-apps.file'
    };

    var file = Drive.Files.insert(resource,blob);
    var doc = DocumentApp.openById(file.id);
    var text = doc.getBody().getText();

    var decoded = Utilities.base64Decode(text,Utilities.Charset.UTF_8);  // This was a byte array
    var decodedstr = Utilities.newBlob(decoded).getDataAsString()  // This was the xml I was looking for
    Logger.log(decodedstr);
    //NEW BIT ENDS HERE 
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...