Gửi idempotency key
Thêm headerIdempotency-Key với giá trị do bạn tự chọn. Lý tưởng nhất là dùng một UUID riêng cho mỗi hành động logic. Hub cũng chấp nhận X-Idempotency-Key hoặc X-Request-Id như các header tương đương.
Cách hoạt động
- Request đầu tiên với một key: được xử lý bình thường, kết quả được lưu lại theo key đó.
- Gửi lại cùng key và cùng nội dung: trả về kết quả đã lưu, không tạo thêm bài đăng nào, và response kèm header
Idempotent-Replayed: true. - Cùng key nhưng khác nội dung: bị từ chối với
409 idempotency_conflict. Không có gì được đăng. - Key khác nhau: được xử lý như một request hoàn toàn mới.
- Bài mà mọi nền tảng đều từ chối (
status: "failed"): không có gì được đăng nên key được giải phóng. Hãy sửa nội dung rồi gửi lại, dùng cùng key hoặc key mới.
Phân biệt kết quả phát lại với một lần đăng thật
Response phát lại giống hệt response gốc: cùngrequest_id, cùng trạng thái. Đó chính là mục đích của cơ chế, nhưng nó cũng có nghĩa là một automation bị kẹt key sẽ liên tục nhận về những response trông như thành công trong khi không có gì mới được đăng.
Vì vậy mọi response phát lại đều kèm một header:
Khi kết quả chưa xác định
Việc đăng bài có thể lâu hơn khoảng thời gian MADIAD Hub được phép chờ. Khi đó request không bị báo là thất bại, vì bài rất có thể đã lên: bên mình ngừng chờ, còn nền tảng thì không ngừng làm việc. Bạn nhận502 với mã upstream_timeout, không có gì được hoàn lại, và key bạn gửi được chốt vào câu trả lời đó. Gửi lại cùng key sẽ nhận đúng 502 và đúng nội dung cũ. Đây là chủ ý: một automation phân nhánh theo mã trạng thái sẽ không thể ghi nhận nhầm một bài chưa rõ thành công.
request_id trong câu trả lời đó là mã của bài. MADIAD Hub tiếp tục theo dõi bài này, và bạn cũng tra được.
Việc cần làm:
- Tra
GET /v1/posts/statusbằngrequest_idđó. Lệnh trảunknowncho tới khi phía nền tảng nhận được bài, sau đó làprocessing, rồi kết quả (completed,draft,partialhoặcfailed). Lịch sử đăng cũng tự cập nhật: khi nền tảng báo kết quả về, chậm nhất là ở lượt kiểm tra hằng ngày kế tiếp. - Đừng gửi lại khi bài còn
unknownhoặcprocessing: bài đầu có thể đã lên hoặc đang lên. - Nếu kết quả cuối là
failedthì không có gì được đăng: lượt đăng được hoàn vàIdempotency-Keycũ dùng lại được. - Bài chữ hoặc bài video đăng ngay mà chưa tới được nền tảng sẽ được lượt kiểm tra hằng ngày chốt là
failed, không sớm hơn. Bài ảnh, bài tài liệu, và mọi bài hẹn giờ hoặc xếp hàng rơi vào trường hợp này thì vẫn làunknown: hãy kiểm tra lịch sử đăng hoặc kiểm tra thẳng trên nền tảng, và nếu bài chưa lên thì gửi lại với mộtIdempotency-Keymới. - Đừng để automation tự retry cùng key rồi mong kết quả khác đi: key cũ vẫn trả đúng câu
502này, kể cả khi bài đã có kết quả. Kết quả nằm ở lệnh tra trạng thái và ở lịch sử đăng.
Bài hẹn giờ hoặc bài xếp hàng (
scheduled_at, add_to_queue) kết thúc theo kiểu này có job_id: null:
chưa có mã lịch. Sau khi MADIAD Hub đọc lại được (khi phía nền tảng báo về, chậm nhất ở lượt kiểm
tra hằng ngày), lịch sử đăng sẽ có job_id để huỷ hoặc dời bài. Một ngoại lệ: bài có nội dung
riêng cho một nền tảng được gửi thành hai lịch. Nếu một lịch được nhận còn câu trả lời của lịch
kia bị mất, câu trả lời mang job_id của lịch đã nhận, và huỷ bằng mã đó chỉ huỷ phần đó; phần
còn lại được đọc lại sau giờ đăng của bài.Khi nào nên dùng
Luôn dùng với bất kỳ request nào có tạo dữ liệu mới, đặc biệt là bài đăng. Cơ chế này thiết yếu khi:- Một client hoặc công cụ workflow (n8n, queues, cron) tự động thử lại khi timeout.
- Một webhook hoặc job có thể được giao nhiều hơn một lần.
- Người dùng nhấp đúp vào nút đăng bài.

