Как получить поле из внешнего API с помощью Google Scripts UrlFetchApp.fetch? - PullRequest
3 голосов
/ 20 июня 2020

Как мне получить поле: dataMain во внешнем API с помощью скрипта Google Apps UrlFetchApp.fetch?

Два дня без результатов. Поддержка от службы поддержки для этого API - это ссылка на https://pestroutes.api-docs.io/3.1/welcome/how-to-use-the-pestroutes-api, которая, похоже, не помогает. Кажется, это должно быть очень просто, но, видимо, нет.

Документы внешнего API: https://pestroutes.api-docs.io/3.1/import/importmainobject

Пример кода (скрипт Google Apps):

function runTest() {
   var at = 'authenticationToken=<myToken>'
   var ak = 'authenticationKey=<myKey>'
   var url ='https://<myCompanyDomain>.pestroutes.com/api/import/main?' + at +'&' + ak;

   var data = [
      {
        'CustomerID':'9854poiu', 
        'CustomerName':'Fred Blair',
        'SquareFt': 3500,
        'Lead':'Fred Blair'
      }
   ];   

   var options = {  
     'method':'post',
     'contentType': 'application/json', 
     'payload': JSON.stringify(data)
   };  

   var response = UrlFetchApp.fetch(url, options);  
   var responseCode = response.getResponseCode()
   var responseBody = response.getContentText()

   if (responseCode === 200) {
      var responseJson = JSON.parse(responseBody);
      Logger.log(responseJson);
   } else {
      Logger.log(Utilities.formatString("Request failed. Expected 200, got %d: %s", responseCode, 
      responseBody))
   }
};

Результат:

{
 endpoint=import, 
 params={endpoint=import,
 authenticationToken=<myToken>,
 authenticationKey=<myKey>, 
 dataMain=[],
 action=main}, 
 tokenUsage={requestsReadInLastMinute=2, requestsReadToday=0, requestsWriteToday=105,
 requestsWriteInLastMinute=0}, count=0.0, tokenLimits={limitWriteRequestsPerMinute=60.0,
 limitReadRequestsPerMinute=60.0, limitWriteRequestsPerDay=3000.0, limitReadRequestsPerDay=3000.0}, 
 requestAction=main, processingTime=153 milliseconds, dataIssueDetails=false, success=false
}

Как видите, массив dataMain=[] должен содержать один объект согласно инструкциям API, но всегда возвращает пустой?

Это проблема с моим кодом, и я неправильно понимаю, как работает API, или это проблема с API? Любая помощь или подсказки были бы очень признательны!

PS. И да, я заменил свой ключ и жетон на myKey и myToken в целях безопасности.

Ответы [ 2 ]

2 голосов
/ 23 июня 2020

Похоже, это вопрос об использовании конечной точки импорта / основной конечной точки PestRoutes для импорта новых клиентов и подписок! Я разработчик PestRoutes, отвечающий за API, и буду рад помочь вам <3. </p>

Вот пример размещения клиента в нашей демонстрационной среде:

Аннотация:

apiModule.call('import','main',{
    "dataMain":[
        {
            "CustomerID": "PestRoutesOverflow1111",
            "Branch": "Demo Pest Control",
            "CustomerName": "PestRoutes Testing01",
            "CustomerAddress": "Walt Disney World Resort, Orlando, FL 32830",
            "CustomerCity": "Orlando",
            "CustomerState": "FL",
            "CustomerZipCode": "32830",
            "CustomerPhone1": "4428675309",
            "CustomerPhone2": "4438675309",
            "CustomerEmail": "",
            "CustomerStatus": "Act"

            //"Frequency": 90,              //These three fields
            //"ServiceType": 'Quarterly',   // are the minimum to
            //"Price": '111',               // create a subscription

            //"Lead": 'No',                 //Set Yes to revert subscription to a LEAD
            //"LastService": '4/26/18',     // If this is set it will override Lead to No
            //"InitialService": '1/26/18',  // If this is set it will override Lead to No
        }
    ]
});

вот как это выглядит как завиток:

curl 'https://demo.pestroutes.com/api/import/main' \
-H 'Connection: keep-alive' \
-H 'Accept: application/json, text/javascript, */*; q=0.01' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'Origin: null' \
-H 'Sec-Fetch-Site: cross-site' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Accept-Language: en-US,en;q=0.9' \
--data-raw 'dataMain%5B0%5D%5BCustomerID%5D=PestRoutesOverflow1111&dataMain%5B0%5D%5BBranch%5D=Demo+Pest+Control&dataMain%5B0%5D%5BCustomerName%5D=PestRoutes+Testing01&dataMain%5B0%5D%5BCustomerAddress%5D=Walt+Disney+World+Resort%2C+Orlando%2C+FL+32830&dataMain%5B0%5D%5BCustomerCity%5D=Orlando&dataMain%5B0%5D%5BCustomerState%5D=FL&dataMain%5B0%5D%5BCustomerZipCode%5D=32830&dataMain%5B0%5D%5BCustomerPhone1%5D=4428675309&dataMain%5B0%5D%5BCustomerPhone2%5D=4438675309&dataMain%5B0%5D%5BCustomerEmail%5D=&dataMain%5B0%5D%5BCustomerStatus%5D=Act&authenticationKey=88492884d8154febd1057372867c2e34b371d8fb&authenticationToken=6915e71f53708f17dba090febd2df4f9d79364d7' \
--compressed

В качестве выборки:

fetch("https://demo.pestroutes.com/api/import/main", {
"headers": {
    "accept": "application/json, text/javascript, */*; q=0.01",
    "accept-language": "en-US,en;q=0.9",
    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "cross-site"
},
"referrerPolicy": "no-referrer-when-downgrade",
"body": "dataMain%5B0%5D%5BCustomerID%5D=PestRoutesOverflow1111&dataMain%5B0%5D%5BBranch%5D=Demo+Pest+Control&dataMain%5B0%5D%5BCustomerName%5D=PestRoutes+Testing01&dataMain%5B0%5D%5BCustomerAddress%5D=Walt+Disney+World+Resort%2C+Orlando%2C+FL+32830&dataMain%5B0%5D%5BCustomerCity%5D=Orlando&dataMain%5B0%5D%5BCustomerState%5D=FL&dataMain%5B0%5D%5BCustomerZipCode%5D=32830&dataMain%5B0%5D%5BCustomerPhone1%5D=4428675309&dataMain%5B0%5D%5BCustomerPhone2%5D=4438675309&dataMain%5B0%5D%5BCustomerEmail%5D=&dataMain%5B0%5D%5BCustomerStatus%5D=Act&authenticationKey=88492884d8154febd1057372867c2e34b371d8fb&authenticationToken=6915e71f53708f17dba090febd2df4f9d79364d7",
"method": "POST",
"mode": "cors",
"credentials": "omit"
}).then( r=>r.json()).then(console.log);

Результат первого запуска:

{
    "params": {
        "endpoint": "import",
        "action": "main",
        "dataMain": [],
        "authenticationKey": "88492884d8154febd1057372867c2e34b371d8fb",
        "authenticationToken": "6915e71f53708f17dba090febd2df4f9d79364d7"
    },
    "tokenUsage": {
        "requestsReadToday": "0",
        "requestsWriteToday": "1",
        "requestsReadInLastMinute": "0",
        "requestsWriteInLastMinute": "0"
    },
    "tokenLimits": {
        "limitReadRequestsPerMinute": 1000,
        "limitReadRequestsPerDay": 1000,
        "limitWriteRequestsPerMinute": 1000,
        "limitWriteRequestsPerDay": 1000
    },
    "requestAction": "main",
    "endpoint": "import",
    "success": true,
    "customersImported": [
        {
            "CustomerID": "PestRoutesOverflow1111",
            "PestRoutesCustomerID": "21257",
            "Action": "Created"
        }
    ],
    "processingTime": "1199 milliseconds",
    "count": 0
}

Результат второго запуска:

{
    "params": {
        "endpoint": "import",
        "action": "main",
        "dataMain": [],
        "authenticationKey": "88492884d8154febd1057372867c2e34b371d8fb",
        "authenticationToken": "6915e71f53708f17dba090febd2df4f9d79364d7"
    },
    "tokenUsage": {
        "requestsReadToday": "0",
        "requestsWriteToday": "2",
        "requestsReadInLastMinute": "1",
        "requestsWriteInLastMinute": "0"
    },
    "tokenLimits": {
        "limitReadRequestsPerMinute": 1000,
        "limitReadRequestsPerDay": 1000,
        "limitWriteRequestsPerMinute": 1000,
        "limitWriteRequestsPerDay": 1000
    },
    "requestAction": "main",
    "endpoint": "import",
    "success": true,
    "customersImported": [
        {
            "CustomerID": "PestRoutesOverflow1111",
            "PestRoutesCustomerID": "21257",
            "Action": "Updated"
        }
    ],
    "processingTime": "1036 milliseconds",
    "count": 0
}

Обратите внимание, что хотя второй запрос с тем же идентификатором клиента будет обновляться, использование этой конечной точки для обновлений клиентов очень опасно и не рекомендуется. (Напишите мне, чтобы узнать об альтернативных рабочих процессах)

Обратите внимание, что объект dataMain в результате всегда пуст. Для большинства конечных точек PestRoutes этот массив параметров будет возвращать полезные данные точно в том виде, в каком они были получены, но это устаревшая конечная точка и выводит немного странно; так что вы можете игнорировать пустоту этого поля как симптом ошибки для данной конкретной конечной точки.

Что касается кодирования типа содержимого; application / x- www-form-urlencoded и multipart / form-data принимаются сервером.

Пожалуйста, свяжитесь со мной по электронной почте michael ~ at ~ pestroutes.com для получения дополнительной помощи:)

1 голос
/ 24 июня 2020

Здесь была успешная реализация с использованием UrlFetchApp.fetch, адаптированного из ответа Майкла. Спасибо всем за поддержку!

function runTest() {

  var at = 'authenticationToken=<myToken>';
  var ak = 'authenticationKey=<myKey>';
  var url ='https://simplehome.pestroutes.com/api/import/main?' + at +'&' + ak;

  var data = 'dataMain[0][CustomerID]=548745&dataMain[0][Branch]=Simple Home Maintenance&dataMain[0][CustomerName]=Jill Blair&dataMain[0][CustomerAddress]=248N 600E, St. George, UT 84770&dataMain[0][CustomerCity]=St. George&dataMain[0][CustomerState]=UT&dataMain[0][CustomerZipCode]=84770&dataMain[0][SquareFt]=2500&dataMain[0][CustomerPhone1]=123-456-7890&dataMain[0][CustomerEmail]=fred@blair.com&dataMain[0][CustomerDateAdded]=6/6/2020&dataMain[0][CustomerStatus]=Act&dataMain[0][Notes]=Test Notes&dataMain[0][Lead]=Yes';

  var options = {  
    'headers': {
    'accept': 'application/json, text/javascript, */*; q=0.01',
    'accept-language': 'en-US,en;q=0.9',      
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'cross-site'
   },
   'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
   'method':'post',
   'payload': data
  };  
    
  var response = UrlFetchApp.fetch(url, options);  
  var responseCode = response.getResponseCode();
  var responseBody = response.getContentText();

  Logger.log(responseCode);
  Logger.log(responseBody);

  if (responseCode === 200) {
     var responseJson = JSON.parse(responseBody);
     Logger.log(responseBody);
  } else {
     Logger.log(Utilities.formatString('Request failed. Expected 200, got %d: %s', 
     responseCode, responseBody));
  };

};

Результат:

 {"params":"endpoint":"import","action":"main","authenticationToken":"myToken",
 "authenticationKey":"<myKey>","dataMain":[]},"tokenUsage":"requestsReadToday":"0","requestsWriteToday":"25","requestsReadInLastMinute":"1","requestsWriteInLastMinute":"0"},"tokenLimits":{"limitReadRequestsPerMinute":60,"limitReadRequestsPerDay":3000,"limitWriteRequestsPerMinute":60,"limitWriteRequestsPerDay":3000},"requestAction":"main","endpoint":"import","success":true,"customersImported":[{"CustomerID":"548745","PestRoutesCustomerID":"10109","Action":"Updated"}],"processingTime":"587 milliseconds","count":0}
...