Не удалось получить api clubhouse.io с помощью UrlFetchApp.fetch

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

Для разработчиков .google.com: Некоторые методы HTTP (например, GET) не принимают полезные данные. Однако API-интерфейс clubhouse v3 ожидает тело / полезные данные в запросе 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 [email protected].","tag":"organization2_missing"}"

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

Теги:

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

person user353305    schedule 26.03.2020    source источник
comment
Должен быть дубликатом stackoverflow.com/questions/56200001, но этот владелец сообщения сдался непосредственно перед тем, как получил ответ   -  person TheMaster    schedule 26.03.2020
comment
По сути, когда вы хотите получить данные, вы не должны передавать полезную нагрузку в свой запрос.   -  person ziganotschka    schedule 26.03.2020


Ответы (1)


Вы можете включить параметры 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.
person Diego    schedule 26.03.2020
comment
приведенный выше код вернет null из-за query: 'label:"my label"' и вернет записи после того, как я изменил его на query: 'label\:my label' - person user353305; 26.03.2020
comment
он вернул нуль с двойными кавычками для меня - person user353305; 26.03.2020