Hướng dẫn này sẽ giới thiệu về khái niệm webhook. Chúng tôi cũng sẽ xây dựng một máy chủ Flask đơn giản có thể nhận webhook GitHub. Chúng tôi cũng sẽ xem cách hiển thị các máy chủ cục bộ của chúng tôi
Webhook là gì?
Trước khi nói về webhook, hãy nói về API. Dưới đây là luồng dữ liệu cho một API
Bạn tạo một yêu cầu GET/POST cho API và bạn sẽ nhận được phản hồi. Nếu bạn muốn tìm hiểu thêm về cách làm việc với API, hãy xem bài viết của tôi về cách làm việc với API bằng Python hoặc bài viết của tôi về cách làm việc với API bằng JavaScript
Hãy xem xét API Github, điều gì sẽ xảy ra nếu chúng ta muốn xây dựng một API sẽ gửi email sử dụng mỗi khi có vấn đề mới được tạo trong repo. Một cách là xây dựng một API sẽ đưa ra yêu cầu cứ sau 1-2 phút để kiểm tra xem có vấn đề mới nào xảy ra hay không và thông báo cho chúng tôi. Quá trình này được gọi là bỏ phiếu. Về cơ bản, chúng tôi sẽ phải thực hiện các yêu cầu định kỳ để kiểm tra một vấn đề mới. Tuy nhiên, điều này có vẻ không hiệu quả. Điều gì sẽ xảy ra nếu GitHub đưa ra yêu cầu đối với API của chúng tôi bất cứ khi nào có sự cố mới được tạo. Đây được gọi là một webhook. Thay vì chúng tôi thực hiện các yêu cầu định kỳ, chúng tôi chỉ cung cấp cho GitHub điểm cuối API của chúng tôi và bất cứ khi nào một vấn đề mới được tạo, một yêu cầu sẽ được gửi đến điểm cuối mà chúng tôi đã cung cấp cho Github. Webhook còn được gọi là API đảo ngược. Dưới đây là so sánh giữa bỏ phiếu và webhook. Hình ảnh này được lấy cảm hứng từ bài viết này
Như bạn có thể nhận thấy, rất nhiều yêu cầu được đưa ra và tùy thuộc vào tần suất chúng tôi đưa ra yêu cầu, có thể có một chút chậm trễ giữa sự cố mới được tạo và API của chúng tôi nhận được thông báo
Hãy tạo một API để nhận yêu cầu bất cứ khi nào có Sự cố mới được tạo trong repo Github
Tạo một máy chủ Flask đơn giản
Đầu tiên, hãy tạo một điểm cuối hello world
from flask import Flask,request,json
app = Flask[__name__]
@app.route['/']
def hello[]:
return 'Webhooks with Python'
if __name__ == '__main__':
app.run[debug=True]
Bây giờ chúng ta cần tạo một điểm cuối để nhận yêu cầu từ API GitHub. Đây sẽ là điểm cuối tiêu chuẩn chấp nhận yêu cầu POST
@app.route['/githubIssue',methods=['POST']]
def githubIssue[]:
data = request.json
print[f'Issue {data["issue"]["title"]} {data["action"]}']
print[f'{data["issue"]["body"]}']
print[f'{data["issue"]["url"]}']
return data
Tôi đã đọc tài liệu và biết các khóa cho các đối tượng JSON. Bạn có thể sử dụng các khóa khác nhau để truy cập nhiều dữ liệu hơn như nhãn vấn đề, v.v.
Bây giờ bạn có thể chạy máy chủ bình của mình
python3 __init__.py
Hiển thị URL máy chủ cục bộ của chúng tôi một cách công khai
Webhooks yêu cầu điểm cuối API công khai vì chúng không thể đưa ra yêu cầu đối với điểm cuối chẳng hạn như 'http. //127. 0. 0. 1. 5000/’. Một cách là triển khai API và sử dụng URL của API đã triển khai. Một cách khác là hiển thị máy chủ cục bộ của bạn dưới dạng URL có sẵn công khai. Điều này sẽ là tạm thời và sẽ chỉ hoạt động miễn là máy chủ Flask của bạn đang chạy. Mọi yêu cầu được thực hiện đối với URL công khai cũng sẽ được thực hiện đối với URL máy chủ cục bộ của bạn
Chúng tôi sẽ sử dụng ngrok để hiển thị URL localhost của chúng tôi. Bạn sẽ phải tạo một tài khoản
Tải xuống ngrok cho hệ điều hành của bạn và giải nén nó. Bây giờ hãy mở một thiết bị đầu cuối và cd vào thư mục chứa tệp ngrok đã giải nén. Nhập lệnh sau trong thiết bị đầu cuối
ngrok http
Ví dụ. Nếu máy chủ bình của bạn đang chạy trên cổng 5000, bạn phải nhập thông tin sau
ngrok http 5000
Bạn sẽ thấy một đầu ra tương tự trong thiết bị đầu cuối của mình. URL công khai là URL bên cạnh 'Chuyển tiếp'. Trong trường hợp của tôi, đó là http. //35cc-69-58-102-156. ngrok. io. Nếu bạn truy cập URL công khai của mình, bạn sẽ thấy điều giống như bạn thấy khi truy cập URL máy chủ cục bộ của mình
Tạo Webhook Vấn đề
Chọn bất kỳ Repo Github nào bạn thích. Truy cập Cài đặt > Webhook > Thêm Webhook
Nhập điểm cuối của bạn, trong trường hợp của tôi, đó là http. //35cc-69-58-102-156. ngrok. io/githubIssue
Vì chúng tôi chỉ muốn yêu cầu được thực hiện khi Sự cố được tạo trong repo, hãy chọn 'Hãy để tôi chọn các sự kiện riêng lẻ. ' và cuộn xuống để chọn 'Sự cố'. Sau khi bạn xuống, hãy cuộn xuống và tạo webhook
Kiểm tra Webhook
Tạo một vấn đề trong repo của bạn
Bây giờ hãy kiểm tra thiết bị đầu cuối nơi máy chủ bình đang chạy. Tôi cũng đã thêm một nhãn và đóng vấn đề
Phần kết luận
Ngay bây giờ máy chủ Flask không làm được gì nhiều. Tuy nhiên, bạn có thể xây dựng trên nó. Thay vì chỉ in dữ liệu nhận được, bạn có thể sử dụng dữ liệu và gửi thông báo đẩy hoặc email. Tôi hy vọng bạn tìm thấy bài viết này hữu ích. Kết nối với trên LinkedIn, Twitter