Не удалось получить api clubhouse.io с помощью UrlFetchApp.fetch - PullRequest
1 голос
/ 26 марта 2020

Постановка проблемы: Невозможно получить данные, используя clubhouse.io api в листах Google> Редактор сценариев

Per developers.google. com : Некоторые методы HTTP (например, GET) не принимают полезную нагрузку. Однако ожидаемый объем / полезная нагрузка API v3 clubhouse в запросе GET

Здесь Метод:

function getClubhouseStories() {
  try{  
    var myHeaders = {"Content-Type": "application/json"};
    var requestOptions = {
      method: 'GET',
      headers: myHeaders,
      body: JSON.stringify({"query":"lable\:my label"}),
      redirect: 'follow',
      query: {"token": "XXXXXXXXUUIDXXXXX"},
      muteHttpExceptions: true
    };

    var response = UrlFetchApp.fetch("https://api.clubhouse.io/api/v3/search/stories", requestOptions);
    }
  catch(error) {
    console.error(error);
  }
  var responseCode = response.getResponseCode();
  var responseContent = response.getContentText();
  Logger.log(responseCode);
  Logger.log(responseContent);
}

Возвращает:

responseCode >> 401
responseContent  >> "{"message":"Sorry, the organization context for this request is missing. If you have any questions please contact us at support@clubhouse.io.","tag":"organization2_missing"}"

Тот же самый запрос прекрасно работает через postman или bash, и запросы, которые не нуждаются в теле также работают через UrlFetchApp.fetch

Метки:

#clubhouse-api #google-apps-scripts #postman

1 Ответ

1 голос
/ 26 марта 2020

Вы можете включить параметры token и query как часть URL.

function getClubhouseStories() {
  try {  
    var requestOptions = { muteHttpExceptions: true };
    var parameters = {
      token: 'XXXXXXXXUUIDXXXXX',
      query: 'label:"my label"' // Clubhouse API requires using double quotes around multi-word labels
    };

    var url = "https://api.clubhouse.io/api/v3/search/stories";
    var response = UrlFetchApp.fetch(buildUrl_(url, parameters), requestOptions);
  } catch (error) {
    console.error(error);
  }
  var responseCode = response.getResponseCode();
  var responseContent = response.getContentText();
  Logger.log(responseCode);
  Logger.log(responseContent);
}

/**
 * Builds a complete URL from a base URL and a map of URL parameters.
 * Source: https://github.com/gsuitedevs/apps-script-oauth2/blob/master/src/Utilities.js#L27
 * @param {string} url The base URL.
 * @param {Object.<string, string>} params The URL parameters and values.
 * @return {string} The complete URL.
 * @private
 */
function buildUrl_(url, params) {
  var paramString = Object.keys(params).map(function(key) {
    return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
  }).join('&');
  return url + (url.indexOf('?') >= 0 ? '&' : '?') + paramString;
}

Другие проблемы, с которыми вы сталкиваетесь, связаны с недопустимыми параметрами запроса UrlFetchApp параметры :

  • Метод по умолчанию - «GET», поэтому нет необходимости указывать
  • Content-Type, следует указывать с помощью contentType, но по умолчанию это «application / x- www-form-urlencoded ", поэтому указывать
  • body недопустимо. Вместо этого следует использовать payload, но не в этом случае, поскольку нам необходимо включить параметры в URL.
  • redirect недопустимо. Следует использовать followRedirects, но это уже по умолчанию true.
  • query недопустимо. Нужно вручную включить в URL.
...