{"meta":{"title":"Обработка доставки веб-перехватчика","intro":"Узнайте, как писать код для прослушивания и реагирования на поставки веб-перехватчика.","product":"Веб-перехватчики","breadcrumbs":[{"href":"/ru/webhooks","title":"Веб-перехватчики"},{"href":"/ru/webhooks/using-webhooks","title":"Использование веб-перехватчиков"},{"href":"/ru/webhooks/using-webhooks/handling-webhook-deliveries","title":"Обработка поставок"}],"documentType":"article"},"body":"# Обработка доставки веб-перехватчика\n\nУзнайте, как писать код для прослушивания и реагирования на поставки веб-перехватчика.\n\n## Введение\n\nПри создании веб-перехватчика необходимо указать URL-адрес и подписаться на типы событий. Когда происходит событие, на которое подписан веб-перехватчик, GitHub отправляет HTTP-запрос с данными о событии в указанный URL-адрес. Если сервер настроен для прослушивания доставки веб-перехватчиков по указанному URL-адресу, он может принять меры при получении одного.\n\nВ этой статье описывается, как писать код, чтобы сервер прослушивал и реагировал на поставки веб-перехватчиков. Вы протестируете код с помощью компьютера или пространства кода в качестве локального сервера.\n\n## Настройка\n\nДля локального тестирования веб-перехватчика можно использовать URL-адрес прокси-сервера веб-перехватчика для пересылки веб-перехватчиков с GitHub компьютера или пространства кода. В этой статье используется smee.io для предоставления URL-адреса прокси-сервера веб-перехватчика и перенаправления веб-перехватчиков.\n\n### Получение URL-адреса прокси-сервера веб-перехватчика\n\n1. В браузере перейдите по адресу <https://smee.io/>.\n2. Нажмите кнопку \" **Пуск нового канала**\".\n3. Скопируйте полный URL-адрес в разделе \"URL-адрес прокси-сервера веб-перехватчика\". Этот URL-адрес будет использоваться в следующих шагах установки.\n\n### Перенаправление веб-перехватчиков\n\n1. Если у вас еще нет [see-client](https://www.npmjs.com/package/smee-client) , выполните следующую команду в терминале:\n\n   ```shell copy\n   npm install --global smee-client\n   ```\n\n2. Чтобы получить перенаправленные веб-перехватчики из smee.io, выполните следующую команду в терминале. Замените `WEBHOOK_PROXY_URL` URL-адрес прокси-сервера веб-перехватчика ранее.\n\n   ```shell copy\n   smee --url WEBHOOK_PROXY_URL --path /webhook --port 3000\n   ```\n\n   Вы увидите выходные данные, которые выглядят следующим образом, где `WEBHOOK_PROXY_URL` находится URL-адрес прокси-сервера веб-перехватчика:\n\n   ```shell copy\n   Forwarding WEBHOOK_PROXY_URL to http://127.0.0.1:3000/webhook\n   Connected WEBHOOK_PROXY_URL\n   ```\n\n   Обратите внимание, что путь есть `/webhook` и порт `3000`. Эти значения будут использоваться позже при написании кода для обработки доставки веб-перехватчиков.\n\n3. Сохраните эту работу, пока вы тестируете веб-перехватчик. Если вы хотите прекратить перенаправление веб-перехватчиков, введите <kbd>CTRL<kbd></kbd>+C.</kbd>\n\n### Создание веб-перехватчика\n\n1. Создайте веб-перехватчик со следующими параметрами. Дополнительные сведения см. в разделе [Создание веб-перехватчиков](/ru/webhooks/using-webhooks/creating-webhooks).\n\n   * Для URL-адреса используйте URL-адрес прокси-сервера веб-перехватчика из более ранних версий.\n   * Если у вас есть возможность выбрать тип контента, используйте JSON.\n\n## Написание кода для обработки доставки веб-перехватчика\n\nЧтобы обрабатывать поставки веб-перехватчика, необходимо написать код, который:\n\n* Инициализация сервера для прослушивания запросов к URL-адресу веб-перехватчика\n* Чтение заголовков и текста HTTP из запроса\n* Выполните требуемое действие в ответ на запрос\n\nВы можете использовать любой язык программирования, который можно запустить на сервере.\n\nВ следующих примерах выводится сообщение при получении доставки веб-перехватчика. Однако можно изменить код, чтобы выполнить другое действие, например отправить запрос к GitHub API или отправить сообщение Slack.\n\n* [Пример Ruby](#ruby-example)\n* [Пример JavaScript](#javascript-example)\n\n### Пример Ruby\n\nВ этом примере используется драгоценный камень Ruby, Sinatra, для определения маршрутов и обработки HTTP-запросов. Дополнительные сведения см. в Sinatra [README](https://github.com/sinatra/sinatra#readme).\n\n#### Пример Ruby: установка зависимостей\n\nЧтобы использовать этот пример, необходимо установить драгоценный камень Sinatra в проекте Ruby. Например, это можно сделать с помощью [bundler](https://bundler.io/):\n\n1. Если у вас еще нет пакета, выполните следующую команду в терминале:\n\n   ```shell copy\n   gem install bundler\n   ```\n\n2. Если у вас еще нет файла Gemfile для приложения, выполните следующую команду в терминале:\n\n   ```shell copy\n   bundle init\n   ```\n\n3. Если у вас еще нет файла Gemfile.lock для приложения, выполните следующую команду в терминале:\n\n   ```shell copy\n   bundle install\n   ```\n\n4. Установите драгоценный камень Sinatra, выполнив следующую команду в терминале:\n\n   ```shell copy\n   bundle add sinatra\n   ```\n\n#### Пример Ruby: написание кода\n\nСоздайте файл Ruby со следующим содержимым. Измените код для обработки типов событий, на которые подписан веб-перехватчик, а также `ping` событие, GitHub которое отправляется при создании веб-перехватчика. В этом примере обрабатываются `issues` события и `ping` события.\n\n```ruby copy annotate\n# These are the dependencies for this code. You installed the `sinatra` gem earlier. For more information, see [Ruby example: Install dependencies](#ruby-example-install-dependencies). The `json` library is a standard Ruby library, so you don't need to install it.\nrequire 'sinatra'\nrequire 'json'\n\n# The `/webhook` route matches the path that you specified for the smee.io forwarding. For more information, see [Forward webhooks](#forward-webhooks).\n#\n# Once you deploy your code to a server and update your webhook URL, you should change this to match the path portion of the URL for your webhook.\npost '/webhook' do\n\n  # Respond to indicate that the delivery was successfully received.\n  # Your server should respond with a 2XX response within 10 seconds of receiving a webhook delivery. If your server takes longer than that to respond, then GitHub terminates the connection and considers the delivery a failure.\n  status 202\n\n  # Check the `X-GitHub-Event` header to learn what event type was sent.\n  # Sinatra changes `X-GitHub-Event` to `HTTP_X_GITHUB_EVENT`.\n  github_event = request.env['HTTP_X_GITHUB_EVENT']\n\n  # You should add logic to handle each event type that your webhook is subscribed to.\n  # For example, this code handles the `issues` and `ping` events.\n  #\n  # If any events have an `action` field, you should also add logic to handle each action that you are interested in.\n  # For example, this code handles the `opened` and `closed` actions for the `issue` event.\n  #\n  # For more information about the data that you can expect for each event type, see [AUTOTITLE](/webhooks/webhook-events-and-payloads).\n  if github_event == \"issues\"\n    data = JSON.parse(request.body.read)\n    action = data['action']\n    if action == \"opened\"\n      puts \"An issue was opened with this title: #{data['issue']['title']}\"\n    elsif action == \"closed\"\n      puts \"An issue was closed by #{data['issue']['user']['login']}\"\n    else\n      puts \"Unhandled action for the issue event: #{action}\"\n    end\n  elsif github_event == \"ping\"\n    puts \"GitHub sent the ping event\"\n  else\n    puts \"Unhandled event: #{github_event}\"\n  end\nend\n```\n\n#### Пример Ruby: тестирование кода\n\nЧтобы протестировать веб-перехватчик, можно использовать компьютер или пространство кода для работы в качестве локального сервера. Если у вас возникли проблемы с этими инструкциями, см [. статью](#troubleshooting) \"Устранение неполадок\".\n\n1. Убедитесь, что вы переадресуете веб-перехватчики. Если вы больше не перенаправляете веб-перехватчики, выполните действия, описанные в [разделе \"Переадресация веб-перехватчиков](#forward-webhooks) \".\n\n2. В отдельном окне терминала выполните следующую команду, чтобы запустить локальный сервер на компьютере или в пространстве кода. Замените `FILE_PATH` путь к файлу, в котором хранится код из предыдущего раздела. Обратите внимание, что `PORT=3000` соответствует порту, указанному для переадресации веб-перехватчика на предыдущем шаге.\n\n   ```shell copy\n   PORT=3000 ruby FILE_NAME\n   ```\n\n   Вы должны увидеть выходные данные, указывающие на то, что \"Sinatra занял этап на 3000\".\n\n3. Активируйте веб-перехватчик. Например, если вы создали веб-перехватчик репозитория, подписанный `issues` на событие, откройте проблему в репозитории. Вы также можете переделить предыдущую доставку веб-перехватчика. Дополнительные сведения см. в разделе [Повторное создание веб-перехватчиков](/ru/webhooks/testing-and-troubleshooting-webhooks/redelivering-webhooks).\n\n4. Перейдите по URL-адресу прокси-сервера веб-перехватчика на smee.io. Должно появиться событие, соответствующее событию, которое вы активировали или перевели. Это означает, что GitHub доставка веб-перехватчика успешно отправлена в указанный URL-адрес полезных данных.\n\n5. В окне терминала, где вы выполнили, `smee --url WEBHOOK_PROXY_URL --path /webhook --port 3000`вы должны увидеть что-то подобное `POST http://127.0.0.1:3000/webhook - 202`. Это означает, что smee успешно перенаправил веб-перехватчик на локальный сервер.\n\n6. В окне терминала, на котором вы выполнили, `PORT=3000 ruby FILE_NAME`появится сообщение, соответствующее событию, которое было отправлено. Например, если вы используете пример кода, приведенный выше, и вы повторно создали `ping` событие, должно появиться сообщение \"GitHub отправлено событие ping\". Вы также можете увидеть некоторые другие строки, которые Sinatra автоматически печатает.\n\n7. В обоих окнах терминала введите <kbd>CTRL<kbd></kbd>+C</kbd>, чтобы остановить локальный сервер и прекратить прослушивание перенаправленных веб-перехватчиков.\n\nТеперь, когда вы протестировали код локально, вы можете внести изменения в использование веб-перехватчика в рабочей среде. Дополнительные сведения см. в разделе [Дальнейшие действия](#next-steps). Если у вас возникли проблемы с тестированием кода, попробуйте выполнить действия, описанные в [разделе](#troubleshooting) \"Устранение неполадок\".\n\n### Пример JavaScript\n\nВ этом примере используется Node.js и библиотека Express для определения маршрутов и обработки HTTP-запросов. Дополнительные сведения см. в expressjs.com[](https://expressjs.com).\n\nПример использования GitHubпакета SDK Octokit.js см. в разделе [Создание приложения GitHub, которое реагирует на события webhook](/ru/apps/creating-github-apps/writing-code-for-a-github-app/building-a-github-app-that-responds-to-webhook-events).\n\nВ этом примере требуется, чтобы компьютер или пространство кода выполнялось Node.js версии 12 или более поздней и npm версии 6.12.0 или более поздней. Дополнительные сведения см. в Node.js[](https://nodejs.org).\n\n#### Пример JavaScript: установка зависимостей\n\nЧтобы использовать этот пример, необходимо установить библиотеку `express` в проекте Node.js. Например:\n\n```shell copy\nnpm install express\n```\n\n#### Пример JavaScript: написание кода\n\nСоздайте файл JavaScript со следующим содержимым. Измените код для обработки типов событий, на которые подписан веб-перехватчик, а также `ping` событие, GitHub которое отправляется при создании веб-перехватчика. В этом примере обрабатываются `issues` события и `ping` события.\n\n```javascript copy annotate\n// You installed the `express` library earlier. For more information, see [JavaScript example: Install dependencies](#javascript-example-install-dependencies).\nconst express = require('express');\n\n// This initializes a new Express application.\nconst app = express();\n\n// This defines a POST route at the `/webhook` path. This path matches the path that you specified for the smee.io forwarding. For more information, see [Forward webhooks](#forward-webhooks).\n//\n// Once you deploy your code to a server and update your webhook URL, you should change this to match the path portion of the URL for your webhook.\napp.post('/webhook', express.json({type: 'application/json'}), (request, response) => {\n\n  // Respond to indicate that the delivery was successfully received.\n  // Your server should respond with a 2XX response within 10 seconds of receiving a webhook delivery. If your server takes longer than that to respond, then GitHub terminates the connection and considers the delivery a failure.\n  response.status(202).send('Accepted');\n\n  // Check the `x-github-event` header to learn what event type was sent.\n  const githubEvent = request.headers['x-github-event'];\n\n  // You should add logic to handle each event type that your webhook is subscribed to.\n  // For example, this code handles the `issues` and `ping` events.\n  //\n  // If any events have an `action` field, you should also add logic to handle each action that you are interested in.\n  // For example, this code handles the `opened` and `closed` actions for the `issue` event.\n  //\n  // For more information about the data that you can expect for each event type, see [AUTOTITLE](/webhooks/webhook-events-and-payloads).\n  if (githubEvent === 'issues') {\n    const data = request.body;\n    const action = data.action;\n    if (action === 'opened') {\n      console.log(`An issue was opened with this title: ${data.issue.title}`);\n    } else if (action === 'closed') {\n      console.log(`An issue was closed by ${data.issue.user.login}`);\n    } else {\n      console.log(`Unhandled action for the issue event: ${action}`);\n    }\n  } else if (githubEvent === 'ping') {\n    console.log('GitHub sent the ping event');\n  } else {\n    console.log(`Unhandled event: ${githubEvent}`);\n  }\n});\n\n// This defines the port where your server should listen.\n// 3000 matches the port that you specified for webhook forwarding. For more information, see [Forward webhooks](#forward-webhooks).\n//\n// Once you deploy your code to a server, you should change this to match the port where your server is listening.\nconst port = 3000;\n\n// This starts the server and tells it to listen at the specified port.\napp.listen(port, () => {\n  console.log(`Server is running on port ${port}`);\n});\n```\n\n#### Пример JavaScript: тестирование кода\n\nЧтобы протестировать веб-перехватчик, можно использовать компьютер или пространство кода для работы в качестве локального сервера. Если у вас возникли проблемы с этими инструкциями, см [. статью](#troubleshooting) \"Устранение неполадок\".\n\n1. Убедитесь, что вы переадресуете веб-перехватчики. Если вы больше не перенаправляете веб-перехватчики, выполните действия, описанные в [разделе \"Переадресация веб-перехватчиков](#forward-webhooks) \".\n\n2. В отдельном окне терминала выполните следующую команду, чтобы запустить локальный сервер на компьютере или в пространстве кода. Замените `FILE_PATH` путь к файлу, в котором хранится код из предыдущего раздела.\n\n   ```shell copy\n   node FILE_NAME\n   ```\n\n   Вы должны увидеть выходные данные, которые говорят `Server is running on port 3000`.\n\n3. Активируйте веб-перехватчик. Например, если вы создали веб-перехватчик репозитория, подписанный `issues` на событие, откройте проблему в репозитории. Вы также можете переделить предыдущую доставку веб-перехватчика. Дополнительные сведения см. в разделе [Повторное создание веб-перехватчиков](/ru/webhooks/testing-and-troubleshooting-webhooks/redelivering-webhooks).\n\n4. Перейдите по URL-адресу прокси-сервера веб-перехватчика на smee.io. Должно появиться событие, соответствующее событию, которое вы активировали или перевели. Это означает, что GitHub доставка веб-перехватчика успешно отправлена в указанный URL-адрес полезных данных.\n\n5. В окне терминала, где вы выполнили, `smee --url WEBHOOK_PROXY_URL --path /webhook --port 3000`вы должны увидеть что-то подобное `POST http://127.0.0.1:3000/webhook - 202`. Это означает, что smee успешно перенаправил веб-перехватчик на локальный сервер.\n\n6. В окне терминала, на котором вы выполнили, `node FILE_NAME`появится сообщение, соответствующее событию, которое было отправлено. Например, если вы используете пример кода, приведенный выше, и вы повторно создали `ping` событие, должно появиться сообщение \"GitHub отправлено событие ping\".\n\n7. В обоих окнах терминала введите <kbd>CTRL<kbd></kbd>+C</kbd>, чтобы остановить локальный сервер и прекратить прослушивание перенаправленных веб-перехватчиков.\n\nТеперь, когда вы протестировали код локально, вы можете внести изменения в использование веб-перехватчика в рабочей среде. Дополнительные сведения см. в разделе [Дальнейшие действия](#next-steps). Если у вас возникли проблемы с тестированием кода, попробуйте выполнить действия, описанные в [разделе](#troubleshooting) \"Устранение неполадок\".\n\n## Устранение неполадок\n\nЕсли ожидаемые результаты, описанные в шагах тестирования, не отображаются, попробуйте следующее:\n\n* Убедитесь, что веб-перехватчик использует URL-адрес прокси-сервера веб-перехватчика (Smee.io URL-адрес). Дополнительные сведения о URL-адресе прокси-сервера веб-перехватчика см. в разделе [\"Получение URL-адреса](#get-a-webhook-proxy-url) прокси-сервера веб-перехватчика\". Дополнительные сведения о параметрах веб-перехватчика см. в разделе [Создание веб-перехватчиков](/ru/webhooks/using-webhooks/creating-webhooks).\n* Убедитесь, что веб-перехватчик использует тип контента JSON, если у вас есть выбор типа контента для использования. Дополнительные сведения о параметрах веб-перехватчика см. в разделе [Создание веб-перехватчиков](/ru/webhooks/using-webhooks/creating-webhooks).\n* Убедитесь, что запущен как клиент smee, так и локальный сервер. Эти процессы выполняются в двух отдельных окнах терминала.\n* Убедитесь, что сервер прослушивает тот же порт, где smee.io перенаправляет веб-перехватчики. Все примеры в этой статье используют порт 3000.\n* Убедитесь, что путь, в котором smee.io перенаправляет веб-перехватчики, соответствует маршруту, определенному в коде. Все примеры, приведенные в этой статье, используют `/webhooks` путь.\n* Проверьте наличие сообщений об ошибках в окнах терминала, где выполняется клиент smee и локальный сервер.\n* Проверьте GitHub , активирована ли доставка веб-перехватчика. Дополнительные сведения см. в разделе [Просмотр доставленных данных веб-перехватчика](/ru/webhooks/testing-and-troubleshooting-webhooks/viewing-webhook-deliveries).\n* Проверьте URL-адрес прокси-сервера веб-перехватчика на smee.io. Должно появиться событие, соответствующее событию, которое вы активировали или перевели. Это означает, что GitHub доставка веб-перехватчика успешно отправлена в указанный URL-адрес полезных данных.\n\n## Следующие шаги\n\nВ этой статье показано, как писать код для обработки доставки веб-перехватчиков. В нем также показано, как протестировать код с помощью компьютера или пространства кода в качестве локального сервера и переадресации доставки веб-перехватчиков с GitHub локального сервера с помощью smee.io. После завершения тестирования кода может потребоваться изменить код и развернуть код на сервере.\n\n### вносит изменения в код;\n\nВ этой статье приведены основные примеры, которые печатают сообщение при получении доставки веб-перехватчика. Может потребоваться изменить код, чтобы выполнить некоторые другие действия. Например, можно изменить код следующим образом:\n\n* Создание запроса к GitHub API\n* Отправка сообщения в Slack\n* События журнала\n* Обновление внешнего средства управления проектами\n\n### Убедитесь, что доставка выполняется из GitHub\n\nВ коде, который обрабатывает поставки веб-перехватчика, необходимо проверить, что доставка выполняется до GitHub дальнейшей обработки доставки. Дополнительные сведения см. в разделе [Проверка доставки веб-перехватчика](/ru/webhooks/using-webhooks/validating-webhook-deliveries).\n\n### Развертывание кода на сервере\n\nВ этой статье показано, как использовать компьютер или пространство кода в качестве сервера при разработке кода. После того как код будет готов к использованию в рабочей среде, необходимо развернуть код на выделенном сервере.\n\nПри этом может потребоваться обновить код, чтобы отразить узел и порт, где прослушивает сервер.\n\n### Обновление URL-адреса веб-перехватчика\n\nПосле создания сервера, который настроен для получения трафика веб-перехватчика, GitHubобновите URL-адрес в параметрах веб-перехватчика. Возможно, потребуется обновить маршрут, который обрабатывает код, чтобы соответствовать части пути нового URL-адреса. Например, если новый URL-адрес веб-перехватчика имеет значение `https://example.com/github-webhooks`, необходимо изменить маршрут в этих примерах на `/webhooks``/github-webhooks`.\n\nНе следует использовать smee.io для пересылки веб-перехватчиков в рабочей среде.\n\n### Применение рекомендаций\n\nВы должны стремиться следовать рекомендациям с веб-перехватчиками. Дополнительные сведения см. в разделе [Рекомендации по использованию веб-перехватчиков](/ru/webhooks/using-webhooks/best-practices-for-using-webhooks).\n\n## Дополнительные материалы\n\n* [Создание приложения GitHub, которое реагирует на события webhook](/ru/apps/creating-github-apps/writing-code-for-a-github-app/building-a-github-app-that-responds-to-webhook-events)\n* [Рекомендации по использованию веб-перехватчиков](/ru/webhooks/using-webhooks/best-practices-for-using-webhooks)"}