Google Apps Script: Как отправить HTTP-запрос?

Что такое HTTP-запрос и зачем он нужен в Apps Script?

HTTP-запрос – это основной способ взаимодействия вашего скрипта с внешними веб-сервисами и API. В Google Apps Script HTTP-запросы позволяют:

Получать данные с веб-сайтов (например, курсы валют, погоду).

Отправлять данные на серверы (например, записывать данные в базы данных, интегрироваться с CRM-системами).

Автоматизировать задачи, требующие взаимодействия с онлайн-сервисами (например, публикация постов в социальных сетях, отправка SMS).

Без HTTP-запросов возможности Apps Script были бы сильно ограничены.

Обзор сервиса UrlFetchApp

UrlFetchApp – это встроенный в Apps Script сервис, который предоставляет функциональность для отправки HTTP-запросов. Он позволяет выполнять GET, POST, PUT, DELETE и другие HTTP-методы. UrlFetchApp предоставляет простой и удобный интерфейс для работы с веб-сервисами.

Необходимые разрешения для выполнения HTTP-запросов

Для выполнения HTTP-запросов скрипту требуются соответствующие разрешения. Google Apps Script автоматически определяет необходимые разрешения на основе кода. Однако, важно понимать, что скрипт запросит разрешение на просмотр и получение информации из внешних служб. Пользователь должен предоставить это разрешение при первом запуске скрипта. Рассмотрите возможность использования scopes. Если вам нужен доступ только к Google API, используйте расширенные сервисы.

Отправка GET-запроса

Простой GET-запрос: получение данных с веб-сайта

GET-запросы используются для получения данных с сервера. Вот пример простого GET-запроса:

/**
 * Получает данные с указанного URL с использованием GET-запроса.
 *
 * @param {string} url URL для отправки GET-запроса.
 * @return {string} Ответ от сервера.
 */
function getData(url: string): string {
  try {
    const response: GoogleAppsScript.URL_Fetch.HTTPResponse = UrlFetchApp.fetch(url);
    return response.getContentText();
  } catch (e) {
    Logger.log("Ошибка при выполнении GET-запроса: " + e);
    return null;
  }
}

// Пример использования
const url: string = 'https://example.com';
const content: string = getData(url);
if (content) {
  Logger.log(content);
}

Обработка ответа: получение кода статуса и содержимого

После выполнения запроса важно проверить код статуса ответа и извлечь содержимое. Код статуса 200 означает успешный запрос. Вот как можно получить код статуса и содержимое:

/**
 * Получает код статуса и содержимое ответа HTTP.
 *
 * @param {string} url URL для отправки GET-запроса.
 * @return {object} Объект с кодом статуса и содержимым.
 */
function getResponseInfo(url: string): object {
  try {
    const response: GoogleAppsScript.URL_Fetch.HTTPResponse = UrlFetchApp.fetch(url);
    const statusCode: number = response.getResponseCode();
    const content: string = response.getContentText();
    return { statusCode: statusCode, content: content };
  } catch (e) {
    Logger.log("Ошибка при выполнении GET-запроса: " + e);
    return null;
  }
}

// Пример использования
const url: string = 'https://example.com';
const responseInfo: object = getResponseInfo(url);
if (responseInfo) {
  Logger.log("Код статуса: " + responseInfo['statusCode']);
  Logger.log("Содержимое: " + responseInfo['content']);
}

Обработка ошибок: что делать, если запрос не удался

Важно предусмотреть обработку ошибок при выполнении HTTP-запросов. Запросы могут не удаться из-за проблем с сетью, неправильного URL или проблем на стороне сервера. Используйте блоки try...catch для обработки исключений.

Отправка POST-запроса

Отправка данных на сервер с использованием POST

POST-запросы используются для отправки данных на сервер. Например, для отправки данных формы или создания нового ресурса. Вот пример POST-запроса:

/**
 * Отправляет данные на указанный URL с использованием POST-запроса.
 *
 * @param {string} url URL для отправки POST-запроса.
 * @param {object} payload Данные для отправки в формате объекта.
 * @return {string} Ответ от сервера.
 */
function postData(url: string, payload: object): string {
  try {
    const options: object = {
      'method': 'post',
      'payload': payload
    };
    const response: GoogleAppsScript.URL_Fetch.HTTPResponse = UrlFetchApp.fetch(url, options);
    return response.getContentText();
  } catch (e) {
    Logger.log("Ошибка при выполнении POST-запроса: " + e);
    return null;
  }
}

// Пример использования
const url: string = 'https://example.com/api/data';
const payload: object = {
  'name': 'John Doe',
  'email': 'john.doe@example.com'
};
const content: string = postData(url, payload);
if (content) {
  Logger.log(content);
}
Реклама

Указание Content-Type: application/json, application/x-www-form-urlencoded

При отправке POST-запроса важно указать правильный Content-Type заголовок. application/json используется для отправки данных в формате JSON, а application/x-www-form-urlencoded – для отправки данных в формате URL-encoded. Для application/json нужно использовать Utilities.jsonStringify(payload), а для application/x-www-form-urlencoded нужно сформировать строку параметров вручную или использовать encodeURIComponent().

const optionsJson: object = {
  'method': 'post',
  'contentType': 'application/json',
  'payload': JSON.stringify(payload)
};

const optionsUrlEncoded: object = {
  'method': 'post',
  'contentType': 'application/x-www-form-urlencoded',
  'payload': Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&')
};

Примеры POST-запросов: отправка данных в Google Sheets, внешние API

POST-запросы можно использовать для отправки данных в Google Sheets (через API) или во внешние API (например, для регистрации пользователя в сервисе рассылок).

Расширенные параметры HTTP-запросов

Настройка заголовков запроса (headers)

Заголовки запроса позволяют передавать дополнительную информацию на сервер. Например, можно установить заголовок Authorization для аутентификации.

const options: object = {
  'method': 'post',
  'headers': {
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
  },
  'payload': payload
};

Установка времени ожидания (timeout)

Время ожидания (timeout) позволяет установить максимальное время ожидания ответа от сервера. Если сервер не отвечает в течение указанного времени, запрос будет прерван.

const options: object = {
  'method': 'get',
  'muteHttpExceptions': true, // allows you to check the response code
  'timeout': 30
};

try {
  const response: GoogleAppsScript.URL_Fetch.HTTPResponse = UrlFetchApp.fetch(url, options);
  const responseCode: number = response.getResponseCode();

  if (responseCode >= 400) {
     // handle error
     Logger.log(`Ошибка при запросе: ${responseCode} - ${response.getContentText()}`);
  } else {
    // process data
     Logger.log("Успешно получены данные");
  }
} catch(e){
  Logger.log("Ошибка при запросе: " + e.toString());
}

Использование аутентификации: OAuth 2.0

Для доступа к API, требующим аутентификации, часто используется протокол OAuth 2.0. Google Apps Script предоставляет встроенные библиотеки для работы с OAuth 2.0. Google Apps Script может обрабатывать OAuth 2.0 для Google API автоматически. Для внешних API может потребоваться ручная настройка.

Практические примеры и советы

Пример: интеграция с внешним API (например, получение погоды)

/**
 * Получает текущую погоду для указанного города с использованием внешнего API.
 *
 * @param {string} city Город для получения погоды.
 * @return {object} Объект с данными о погоде.
 */
function getWeatherData(city: string): object {
  const apiKey: string = 'YOUR_API_KEY'; // Замените на свой API ключ
  const url: string = `https://api.weatherapi.com/v1/current.json?key=${apiKey}&q=${city}&aqi=no`;

  try {
    const response: GoogleAppsScript.URL_Fetch.HTTPResponse = UrlFetchApp.fetch(url);
    const content: string = response.getContentText();
    const data: object = JSON.parse(content);
    return data;
  } catch (e) {
    Logger.log("Ошибка при получении данных о погоде: " + e);
    return null;
  }
}

// Пример использования
const city: string = 'Moscow';
const weatherData: object = getWeatherData(city);
if (weatherData) {
  Logger.log(weatherData);
}

Оптимизация производительности: кеширование ответов

Для повышения производительности можно кешировать ответы от API. Используйте сервис CacheService для хранения ответов на определенное время.

Советы по безопасности при работе с HTTP-запросами

Не храните секретные ключи и пароли в коде скрипта. Используйте PropertiesService.

Проверяйте и очищайте данные, полученные от внешних источников.

Ограничьте разрешения скрипта только необходимыми.

Используйте HTTPS для защиты передаваемых данных.


Добавить комментарий