В последнее время я обращался с множеством третьих сторонних интеграций, которые требовали обслуживания для управления веб -крючками, когда возникают определенные события. Итак, сегодня я хочу выделить определенные ключевые моменты на входящих веб -крючках и сравнить методы интеграции, используя WebHooks против подхода, основанного на опросе.
Представьте себе этот сценарий:
Случай клиента закрыт в ServiceNow. Вскоре после этого клиент получает автоматический телефонный звонок от третьей партийной системы с просьбой отметить услугу с 1 до 5. Как только он отправит свою записку, ServiceNow должен обновить исходный случай с этими комментариями. Но вот пример: ServiceNow должен оставаться информированным о состоянии опроса в любое время.
В этом сценарии я полагаю, что система, которую мы интегрируем с поддержкой Webhook.
Давайте рассмотрим два решения для управления этим, но сначала мы должны знать, когда использовать WebHook:
- Сообщения, вызванные конкретными событиями
- Полезный отдаленный человек в свете и световой информации
- Уведомления на основе мощности для устранения частых опросов
- Необходимо только простое признание
Решение 1: подход на основе опроса
1. Сообщение из пост -отдыха: ServiceNow указывает на внешнюю систему, что дело закрыто и просит его запустить опрос.
2. Получите сообщение REST: ServiceNow периодически проверяет, чтобы увидеть государство и примечание опроса.
3. Планируемое использование или поток: регулярно работает, чтобы проверить, завершил ли клиент расследование и обновляет дело соответствующим образом.
Это решение работает, но оно потребляет ненужные ресурсы из -за непрерывного обследования и немного сложны.
Давайте посмотрим на решение 2
Решение 2: подход на основе веб -хука
1. Сообщение от пост -отдыха: идентично ранее, сообщите внешней системе, что корпус закрыт.
2
Это решение кажется привлекательным, потому что мы получаем обновления в режиме реального времени, мы уменьшаем использование ресурсов и намного проще и чище.
Пример полезной нагрузки Webhook
Вот что мы получили бы третий -сторонник Webhook:
{
"web_hook_id": "0229302039",
"survey": "complete",
"case_number": "CS0123267",
"customer_rating": 5
}
Вот как создать сценарий REST API для получения WebHook
-
Доступ: System Web Services> API Scripted Rest.
-
Нажмите «Новый», предоставьте основное имя и путь API и нажмите «Отправить».
-
Под созданным API REST нажмите на ресурсы, затем нажмите «Новый».
-
Предоставьте подробности:
Что касается аутентификации, в этом примере я генерирую уникальный токен, используя Glides OnRandomutil — GetSecurerandomString и хранят его в качестве свойства зашифрованного системы. Я притворяюсь, что внешняя система передает ее в качестве ключевого API в заголовке спроса.
Вот как создать один сейф:
var secureRandom = GlideSecureRandomUtil;
sToken = secureRandom.getSecureRandomString(25);
Вот образец сценария для управления запросами WebHook в сценарии API:
(function process(request, response) {
// Retrieve the request URL to validate incoming request origin
var requestedURI = request.url;
// Fetch the valid API key stored securely in system properties
var validApiKey = gs.getProperty('sn_customerservice.webhook.api.key');
// Get the API key provided in the request header for authentication
var apiKeyFromHeader = request.getHeader('X-API-Key');
// Validate the provided API key and ensure the request URL is from the trusted domain
if (apiKeyFromHeader !== validApiKey || requestedURI.indexOf('trustedDomain') == -1) {
// If validation fails, respond with a 403 Forbidden error
response.setStatus(403);
response.setBody({
"error": "Forbidden",
"message": "Unauthorized: invalid API key or domain"
});
return; // Terminate execution if validation fails
}
// Extract the JSON payload data from the webhook request body
var body = request.body.data;
// Obtain case number and customer rating from the payload
var caseNumber = body.case_number;
var customerRating = body.customer_rating;
// Prepare to update the specific customer service case
var grCS = new GlideRecord('sn_customerservice_case');
grCS.addQuery('number', caseNumber); // Search case by its number
grCS.query();
// If the case record exists, update the customer rating
if (grCS.next()) {
grCS.u_customer_rating = customerRating; // Update rating field
grCS.update(); // Commit changes
// Send a successful response confirming the update
response.setStatus(200);
response.setBody({
"message": "Case updated successfully."
});
} else {
// If case not found, respond with a 404 Not Found error
response.setStatus(404);
response.setBody({
"error": "Case not found."
});
}
})(request, response);