Saat membangun sistem Pub/Sub, pembukaan payload dapat membantu Anda terhubung ke sistem lain yang tidak mematuhi semua persyaratan sistem dari penerapan endpoint push Pub/Sub standar.
Beberapa kasus penggunaan potensial untuk pembukaan payload adalah sebagai berikut:
- Anda tidak ingin menulis kode penguraian pesan khusus Pub/Sub untuk endpoint push HTTP.
- Anda lebih suka menerima metadata pesan Pub/Sub sebagai header HTTP, bukan metadata di isi HTTP POST.
- Anda ingin mengirim pesan Pub/Sub dan mengecualikan metadata Pub/Sub, misalnya saat mengirim data ke API pihak ketiga.
Cara kerja pembukaan payload
Pembukaan payload adalah fitur yang menghapus semua metadata pesan dari pesan Pub/Sub, kecuali data pesan. Dengan mengirim data pesan mentah, pelanggan dapat memproses pesan tanpa harus mematuhi persyaratan sistem Pub/Sub.
- Dengan pembukaan payload, data pesan dikirim langsung sebagai isi HTTP.
- Tanpa pembukaan payload, Pub/Sub akan mengirimkan objek JSON yang berisi beberapa kolom metadata pesan dan kolom data pesan. Dalam hal ini, JSON harus diuraikan untuk mengambil data pesan, lalu di-decode base64.
Menulis metadata
Setelah mengaktifkan pembukaan payload, Anda dapat menggunakan opsi tulis metadata yang menambahkan metadata pesan yang sebelumnya dihapus ke dalam header permintaan.
- Tulis metadata diaktifkan. Tambahkan metadata pesan kembali ke header permintaan. Juga mengirimkan data pesan mentah yang di-decode.
- Tulis metadata dinonaktifkan. Hanya mengirimkan data pesan mentah yang di-decode.
Tulis metadata diekspos melalui Pub/Sub, argumen Google Cloud CLI
--push-no-wrapper-write-metadata, dan properti API NoWrapper.
Secara default, nilai ini adalah null.
Sebelum memulai
- Pelajari langganan Pub/Sub dan langganan push. Pembukaan payload hanya dapat digunakan dengan langganan push.
- Pelajari cara mengonfigurasi langganan push.
Contoh pesan yang di-wrap dan tidak di-wrap
Contoh berikut mengilustrasikan perbedaan antara mengirim pesan HTTP yang di-wrap dan tidak di-wrap. Dalam contoh ini, data pesan berisi
string {"status": "Hello there"}.
Untuk contoh ini, langganan dibuat dengan fitur pembukaan payload yang diaktifkan dan memublikasikan pesan ke mytopic. Langganan ini menggunakan kunci pengurutan dengan nilai some-key dan jenis media dideklarasikan sebagai application/json.
gcloud pubsub topics publish mytopic
--message='{"status": "Hello there"}'
--ordering-key="some-key"
--attribute "Content-Type=application/json"
Bagian berikut menunjukkan perbedaan antara pesan yang di-wrap dan tidak di-wrap.
Pesan yang di-wrap
Contoh berikut menunjukkan pesan yang di-wrap Pub/Sub standar. Dalam hal ini, pembukaan payload tidak diaktifkan.
| Publikasikan | Endpoint Push Menerima |
|---|---|
data="{"status": "Hello there"}"
ordering_key="some-key"
attributes=
{
{"Content-Type", "application/json"}
} |
Content-Length: 361
Content-Type: application/json
User-Agent: CloudPubSub-Google
Host: subscription-project.uc.r.appspot.com
{
"message": {
"attributes": {
"Content-Type": "application/json"
},
"data": "eyJzdGF0dXMiOiAiSGVsbG8gdGhlcmUifQ==", // Base64 - {"status": "Hello there"}
"messageId": "2070443601311540",
"message_id": "2070443601311540",
"publishTime": "2021-02-26T19:13:55.749Z",
"publish_time": "2021-02-26T19:13:55.749Z"
},
"subscription": "projects/myproject/..."
} |
Pesan yang tidak di-wrap dengan metadata tulis dinonaktifkan
Contoh berikut menunjukkan pesan yang tidak di-wrap dengan opsi metadata tulis dinonaktifkan. Dalam hal ini, header x-goog-pubsub-* dan atribut pesan
tidak disertakan.
| Publikasikan | Endpoint Push Menerima |
|---|---|
data="{"status": "Hello there"}"
ordering_key="some-key"
attributes=
{
{"Content-Type", "application/json"}
} |
Content-Length: 25
User-Agent: CloudPubSub-Google
Host: subscription-project.uc.r.appspot.com
{"status": "Hello there"} |
Pesan yang tidak di-wrap dengan metadata tulis diaktifkan
Contoh berikut menunjukkan pesan yang tidak di-wrap dengan opsi metadata tulis diaktifkan. Dalam hal ini, header x-goog-pubsub-* dan atribut pesan
disertakan.
| Publikasikan | Endpoint Push Menerima |
|---|---|
data="{"status": "Hello there"}"
ordering_key="some-key"
attributes=
{
{"Content-Type", "application/json"}
} |
x-goog-pubsub-subscription-name: "projects/myproject/..."
x-goog-pubsub-message-id: "2070443601311540"
x-goog-pubsub-publish-time: "2021-02-26T19:13:55.749Z"
x-goog-pubsub-ordering-key: "some-key"
Content-Type: application/json
Content-Length: 12
User-Agent: CloudPubSub-Google
Host: subscription-project.uc.r.appspot.com
{"status": "Hello there"} |
Mengonfigurasi pembukaan payload
Anda dapat mengaktifkan pengiriman push pembukaan payload untuk langganan menggunakan halaman Subscription Details konsol, Google Cloud CLI, atau Library Klien. Google Cloud
Konsol
Di Google Cloud konsol, buka halaman Subscriptions.
Klik Create subscription.
Di kolom Subscription ID, masukkan nama.
Untuk mengetahui informasi tentang cara memberi nama langganan, lihat Panduan untuk memberi nama topik atau langganan.
Pilih topik dari menu drop-down. Langganan akan menerima pesan dari topik tersebut.
Untuk Delivery type, pilih Push.
Untuk mengaktifkan pembukaan payload, pilih Enable payload unwrapping.
(Opsional) Untuk mempertahankan metadata pesan di header permintaan, pilih Write metadata. Anda harus mengaktifkan opsi ini untuk menetapkan header Content-Type bagi pesan Anda.
Tentukan URL endpoint.
Pertahankan semua nilai default lainnya.
Klik Create.
gcloud
Untuk mengonfigurasi langganan dengan pembukaan payload yang menyertakan header HTTP standar, jalankan gcloud pubsub subscriptions create
perintah berikut:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper
Ganti kode berikut:
SUBSCRIPTION: nama atau ID langganan push Anda.TOPIC: ID topik.PUSH_ENDPOINT: URL yang akan digunakan sebagai endpoint untuk langganan ini. Misalnya,https://myproject.appspot.com/myhandler--push-no-wrapper: mengirimkan data pesan langsung sebagai isi HTTP.
Untuk mengonfigurasi langganan dengan pembukaan payload dan mengontrol penggunaan header x-goog-pubsub-*, jalankan perintah berikut:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper \ --push-no-wrapper-write-metadata
--push-no-wrapper-write-metadata: Jika benar (true), akan menulis metadata pesan Pub/Sub ke header permintaan HTTP.x-goog-pubsub-<KEY>:<VAL>Menulis atribut pesan Pub/Sub ke header<KEY>:<VAL>permintaan HTTP.
Python
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Python Pub/Sub.
Java
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Java Pub/Sub.
C++
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C++ di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C++ Pub/Sub.
Go
Contoh berikut menggunakan versi utama library klien Pub/Sub Go (v2). Jika Anda masih menggunakan library v1, lihat panduan migrasi ke v2. Untuk melihat daftar contoh kode v1, lihat contoh kode yang tidak digunakan lagi.
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Go Pub/Sub.
Node.js
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Pub/Sub.
Node.js
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Pub/Sub.
Menetapkan header jenis konten dalam pesan
Setelah mengaktifkan pembukaan payload, Pub/Sub tidak akan otomatis menetapkan kolom header jenis media dalam permintaan Anda. Jika Anda
tidak menetapkan kolom header Content-Type secara eksplisit, server web
yang memproses permintaan Anda mungkin akan menetapkan nilai default
application/octet-stream
atau menafsirkan permintaan dengan cara yang tidak terduga.
Jika Anda memerlukan header Content-Type, pastikan Anda mendeklarasikannya secara eksplisit pada waktu publikasi untuk setiap pesan yang dipublikasikan. Untuk melakukannya, Anda harus mengaktifkan Write metadata terlebih dahulu. Hasil pengaktifan Write metadata
ditampilkan dalam contoh yang diberikan.
Langkah berikutnya
- Jika Anda mengalami masalah dengan pembukaan payload, lihat Memecahkan masalah pembukaan payload.