Как назначить UrlFetchApp с базовой авторизацией для кнопки? - PullRequest
0 голосов
/ 10 февраля 2019

Я создал функцию в Google Apps Script, которая хорошо работает, когда я запускаю ее в Google Apps Script.Выходные данные возвращаются в Google Sheets.

function testFunction11() {
  var rng = SpreadsheetApp.getActiveRange();
  var encodedAuthInformation = Utilities.base64Encode("username:key");
  var headers = {"Authorization" : "Basic " + encodedAuthInformation};
  var params = {
    'method': 'GET',
    'muteHttpExceptions': true,
    'headers': headers
  };
  var res = UrlFetchApp.fetch("https://api.apiservice.com/api/v1/xxx?fields=somefields", params);
  Logger.log(res.getContentText());
  rng.setValue(res);
}

Вывод в ячейку:

[
  {
    "id": xxx,
    "createdDate": "2019-02-01T04:54:00Z",
    "reference": "XXX"
  },
etc

Затем я назначаю скрипт кнопке 'testFunction11'.И когда я нажимаю кнопку, она возвращает

{
  "message": "An error has occurred."
}

Это похоже на ответ от сервера API.

Моя единственная гипотеза состоит в том, что кнопка на листе Google добавляет несколько заголовков, User-Agent или content-typeна запрос, который не разрешен в API сервере.И после некоторого поиска, я думаю, я не могу переназначить User-Agent в запросе.Это что-то правильно, или я делаю это неправильно?

РЕДАКТИРОВАТЬ 1:

Заголовки для каждого случая console.log(UrlFetchApp.getRequest(url, params)): при нажатии кнопки в электронной таблице:

{headers={Authorization=Basic XXXXXXXXQVU6MWVhODlmZmFkN2U3NGNjOGJkOTc1YTE1ZjVhNTE3MzE=, X-Forwarded-For=178.xx.my.ip}, method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://api.apisite.com/api/v1/SalesOrders?fields=Id,Createddate,Reference&where=Createddate%3E2019-02-01T00:00:00Z}

И для скрипта:

{headers={Authorization=Basic XXXXXXXXQVU6MWVhODlmZmFkN2U3NGNjOGJkOTc1YTE1ZjVhNTE3MzE=}, method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://api.apisite.com/api/v1/SalesOrders?fields=Id,Createddate,Reference&where=Createddate%3E2019-02-01T00:00:00Z}

Таким образом, кнопка добавляет только X-Forwarded-For.

Когда я пытался вручную добавить X-Forwarded-For: 'unknown', появляются такие ошибки

There are attribute with impossible value: Header:X-Forwarded-For

Текст ошибки на русском языке, извините за, возможно, не точный перевод.Это весело, потому что, когда я добавил Test: unknown таким же образом, там нет ошибок, но, очевидно, не работает.Похоже, Google не позволяет изменять это значение.

Попробует разные заголовки в почтальоне и, возможно, подтвердит, что этот заголовок является причиной ошибки.Спасибо @ TheMaster

РЕДАКТИРОВАТЬ 2:

Я пробовал разные заголовки через Почтальон.Таким образом, в результате, когда я добавляю в заголовки ключ X-Forwarded-For с любым значением, он возвращает "message": "An error has occurred." Когда я не добавляю этот ключ, он работает хорошо.

Итак, вопрос заключается в том, чтобы отключить добавление этого заголовка с помощью скрипта Google Apps.Кажется, что нет.

1 Ответ

0 голосов
/ 11 февраля 2019
  • В вашей ситуации, когда UrlFetchApp.fetch() запускается с кнопки в электронной таблице, X-Forwarded-For автоматически добавляется в заголовок.
  • При добавлении X-Forwarded-For в заголовок возникает ошибкаAn error has occurred. происходит.
  • С другой стороны, X-Forwarded-For не используется в заголовке, ошибка не возникает.

Если мое понимание правильное, как насчет этого обходного пути?Я думаю, что может быть несколько обходных путей.Поэтому, пожалуйста, подумайте об этом как об одном из них.В этом временном решении веб-приложения используются в качестве функции-оболочки.

Пример сценария:

Сначала скопируйте и вставьте следующий сценарий.И, пожалуйста, установите testFunction11() на кнопку.При запуске testFunction11() testFunction11() запрашивает веб-приложения (doGet()), а веб-приложения запрашивают https://api.apiservice.com/api/v1/xxx?fields=somefields.При этом X-Forwarded-For не используется в заголовке запроса.Затем возвращается результат веб-приложений и помещается значение в электронную таблицу. Разверните веб-приложения перед запуском сценария.

function testFunction11() {
  var rng = SpreadsheetApp.getActiveRange();
  var url = ScriptApp.getService().getUrl();
  var params = {method: "get", headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}};
  var res = UrlFetchApp.fetch(url, params);
  Logger.log(res.getContentText());
  rng.setValue(res);
}

function doGet() {
  var url = "https://api.apiservice.com/api/v1/xxx?fields=somefields";
  var encodedAuthInformation = Utilities.base64Encode("username:key");
  var headers = {"Authorization" : "Basic " + encodedAuthInformation};
  var params = {
    'method': 'GET',
    'muteHttpExceptions': true,
    'headers': headers
  };
  var res = UrlFetchApp.fetch(url, params);
  return ContentService.createTextOutput(res.getContentText());
}

Развертывание веб-приложений:

Перед запуском этого сценария разверните веб-приложения.

  • В редакторе сценариев
  • Публикация -> Развертывание как веб-приложение
    1. Создание новой версии проекта
    2. В поле «Выполнить приложение выберите»Я "
    3. В разделе" Кто имеет доступ к приложению ",
      • , если функция используется только вами, выберите" Только я ".
      • , если функция используетсянесколькими пользователями выберите «Любой».
    4. Нажмите «Развернуть»
    5. Скопируйте «URL текущего веб-приложения»
    6. Нажмите «ОК»

Примечание:

  • Когда вы изменили скрипт, пожалуйста, повторно разверните Веб-приложения как новую версию.Таким образом, последний сценарий отражается в веб-приложениях. Это важный момент.
  • Это простой пример сценария.Поэтому, пожалуйста, измените вашу ситуацию.

Ссылки:

...