Beim Erstellen Ihres Pub/Sub-Systems können Sie durch das Entpacken der Nutzlast eine Verbindung zu anderen Systemen herstellen, die nicht alle Systemanforderungen einer standardmäßigen Pub/Sub-Push-Endpunktimplementierung erfüllen.
Hier einige mögliche Anwendungsfälle für das Entpacken der Nutzlast:
- Sie möchten keinen Pub/Sub-spezifischen Nachrichten-Parsing-Code für Ihre HTTP-Push-Endpunkte schreiben.
- Sie bevorzugen Pub/Sub-Nachrichtenmetadaten als HTTP-Header anstelle der Metadaten im HTTP-POST-Text.
- Sie möchten Pub/Sub-Nachrichten senden und die Pub/Sub-Metadaten ausschließen, z. B. beim Senden von Daten an eine Drittanbieter-API.
So funktioniert das Entpacken der Nutzlast
Das Entpacken der Nutzlast ist eine Funktion, bei der Pub/Sub-Nachrichten mit Ausnahme der Nachrichtendaten aus allen Nachrichtenmetadaten entfernt werden. Durch das Senden von Nachrichtenrohdaten können Abonnenten die Nachricht verarbeiten, ohne die Systemanforderungen von Pub/Sub beachten zu müssen.
- Beim Entpacken der Nutzlast werden die Nachrichtendaten direkt als HTTP-Text zugestellt.
- Ohne das Entpacken der Nutzlast liefert Pub/Sub ein JSON-Objekt, das mehrere Metadatenfelder der Nachricht und ein Nachrichtendatenfeld enthält. In diesem Fall muss die JSON-Datei geparst werden, um die Nachrichtendaten abzurufen, und dann base64-decodieren.
Metadaten schreiben
Nachdem Sie das Entpacken der Nutzlast aktiviert haben, können Sie mit der Option Metadaten schreiben zuvor entfernte Nachrichtenmetadaten in den Anfrageheader einfügen.
- „Metadaten schreiben“ aktiviert. Fügen Sie dem Anfrageheader wieder Nachrichtenmetadaten hinzu. Sendet auch die decodierten Rohdaten der Nachricht.
- „Metadaten schreiben“ deaktiviert. Sendet nur die decodierten Rohdaten der Nachricht.
Schreibmetadaten werden über Pub/Sub, das Google Cloud CLI-Argument --push-no-wrapper-write-metadata
und das API-Attribut NoWrapper
bereitgestellt.
Dieser Wert ist standardmäßig null.
Hinweise
- Weitere Informationen zu Pub/Sub-Abos und Push-Abos Das Entpacken der Nutzlast kann nur bei Push-Abos verwendet werden.
- Informationen zum Konfigurieren eines Push-Abos
Beispiel für umschlossene und unverpackte Nachrichten
Die folgenden Beispiele veranschaulichen den Unterschied zwischen dem Senden einer umschlossenen und einer entpackten HTTP-Nachricht. In diesen Beispielen enthalten die Nachrichtendaten den String {"status": "Hello there"}
.
In diesem Beispiel wird ein Abo erstellt, bei dem die Funktion zum Entpacken der Nutzlast aktiviert ist, und eine Nachricht wird in mytopic
veröffentlicht. Dabei wird ein Sortierungsschlüssel mit dem Wert some-key
verwendet und der Medientyp wird als application/json
deklariert.
gcloud pubsub topics publish mytopic --message='{"status": "Hello there"}' --ordering-key="some-key" --attribute "Content-Type=application/json"
In den folgenden Abschnitten wird der Unterschied zwischen umschlossenen und entpackten Nachrichten beschrieben.
Umgebrochene Nachricht
Das folgende Beispiel zeigt eine mit Pub/Sub umschlossene Standardnachricht. In diesem Fall ist das Entpacken von Payloading nicht aktiviert.
Veröffentlichen | Push-Endpunkt empfängt Nachrichten |
---|---|
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/..." } |
Nicht umschlossene Nachricht mit deaktiviertem Schreiben von Metadaten
Das folgende Beispiel zeigt eine entpackte Nachricht mit deaktivierter Option zum Schreiben von Metadaten. In diesem Fall sind die Header x-goog-pubsub-*
und Nachrichtenattribute nicht enthalten.
Veröffentlichen | Push-Endpunkt empfängt Nachrichten |
---|---|
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"} |
Entpackte Nachricht mit aktivierter Option zum Schreiben von Metadaten
Das folgende Beispiel zeigt eine entpackte Nachricht mit aktivierter Option „Metadaten schreiben“. In diesem Fall sind die Header x-goog-pubsub-*
und Nachrichtenattribute enthalten.
Veröffentlichen | Push-Endpunkt empfängt Nachrichten |
---|---|
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"} |
Entpacken der Nutzlast konfigurieren
Sie können das Entpacken der Nutzlast für ein Abo über die Seite Abodetails in der Google Cloud Console, die Google Cloud CLI oder die Clientbibliotheken aktivieren.
Console
Öffnen Sie in der Google Cloud Console die Seite Abos.
Klicken Sie auf Abo erstellen.
Geben Sie im Feld Abo-ID einen Namen ein.
Weitere Informationen zum Benennen eines Abos finden Sie in den Richtlinien zum Benennen von Themen oder Abos.
Wählen Sie ein Thema aus dem Drop-down-Menü aus. Das Abo empfängt Nachrichten aus dem Thema.
Wählen Sie als Zustellungstyp die Option Push aus.
Wählen Sie Entpacken der Nutzlast aktivieren aus, um das Entpacken der Nutzlast zu aktivieren.
(Optional) Wenn die Metadaten von Nachrichten im Anfrageheader beibehalten werden sollen, wählen Sie Metadaten schreiben aus. Sie müssen diese Option aktivieren, um einen Content-Type-Header für Ihre Nachrichten festzulegen.
Geben Sie eine Endpunkt-URL an.
Behalten Sie alle anderen Standardwerte bei.
Klicken Sie auf Erstellen.
gcloud
Führen Sie den folgenden gcloud pubsub subscriptions create
-Befehl aus, um ein Abo mit Entpackung der Nutzlast zu konfigurieren, das Standard-HTTP-Header enthält:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper
Ersetzen Sie Folgendes:
SUBSCRIPTION
: der Name oder die ID Ihres Pull-Abos.TOPIC
: die ID des Themas.PUSH_ENDPOINT
: die URL, die als Endpunkt für dieses Abo verwendet werden soll. z. B.https://myproject.appspot.com/myhandler
.--push-no-wrapper
: sendet die Nachrichtendaten direkt als HTTP-Text.
Führen Sie den folgenden Befehl aus, um ein Abo mit Entpackung der Nutzlast zu konfigurieren und die Verwendung von x-goog-pubsub-*
-Headern zu steuern:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper \ --push-no-wrapper-write-metadata
--push-no-wrapper-write-metadata
: Wenn dieser Wert auf „true“ gesetzt ist, werden die Metadaten der Pub/Sub-Nachrichten in diex-goog-pubsub-<KEY>:<VAL>
-Header der HTTP-Anfrage geschrieben. Schreibt die Pub/Sub-Nachrichtenattribute in<KEY>:<VAL>
-Header der HTTP-Anfrage.
Python
Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Python in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Python API.
Java
Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Java in der Kurzanleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Java API.
C++
Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für C++ in der Kurzanleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub C++ API.
Einfach loslegen (Go)
Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Go in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Go API.
Node.js
Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für PHP in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Node.js API.
Node.js
Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für PHP in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Node.js API.
Inhaltstyp-Header in der Nachricht festlegen
Nachdem Sie das Entpacken der Nutzlast aktiviert haben, legt Pub/Sub in Ihrer Anfrage nicht automatisch ein Header-Feld für den Medientyp fest. Wenn Sie das Header-Feld Content-Type
nicht explizit festlegen, legt der Webserver, der Ihre Anfrage verarbeitet, möglicherweise den Standardwert application/octet-stream
fest oder interpretiert die Anfrage auf unerwartete Weise.
Wenn Sie einen Content-Type
-Header benötigen, müssen Sie ihn bei der Veröffentlichung für jede einzelne veröffentlichte Nachricht explizit deklarieren. Dazu müssen Sie zuerst die Option Metadaten schreiben aktivieren. Das Ergebnis der Aktivierung von Metadaten schreiben wird in den bereitgestellten Beispielen gezeigt.
Nächste Schritte
- Weitere Informationen zu Problemen beim Entpacken der Nutzlast finden Sie unter Fehler beim Entpacken der Nutzlast beheben.