Menulis dan merespons pesan Pub/Sub

ID region

REGION_ID adalah kode singkat yang ditetapkan Google berdasarkan region yang Anda pilih saat membuat aplikasi. Kode ini tidak sesuai dengan negara atau provinsi, meskipun beberapa ID region mungkin tampak mirip dengan kode negara dan provinsi yang umum digunakan. Untuk aplikasi yang dibuat setelah Februari 2020, REGION_ID.r disertakan dalam URL App Engine. Untuk aplikasi lama yang dibuat sebelum tanggal tersebut, ID region bersifat opsional dalam URL.

Pelajari ID region lebih lanjut.

Pub/Sub menyediakan pesan yang andal, many-to-many, dan asinkron antara aplikasi. Aplikasi penayang dapat mengirim pesan ke topik, dan aplikasi lain dapat berlangganan topik tersebut untuk menerima pesan.

Dokumen ini menjelaskan cara menggunakan Library Klien Cloud untuk mengirim dan menerima pesan Pub/Sub di aplikasi App Engine.

Prasyarat

Meng-clone aplikasi contoh

Salin aplikasi contoh ke komputer lokal Anda, lalu buka direktori pubsub:

Go

git clone https://github.com/GoogleCloudPlatform/golang-samples.git
cd golang-samples/appengine/go11x/pubsub/authenicated_push

Java

Tidak ada contoh yang tersedia untuk runtime ini.

Perhatikan bahwa aplikasi demo Java tersedia di lingkungan fleksibel.

Node.js

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/appengine/pubsub

PHP

git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
cd php-docs-samples/pubsub

Python

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/standard_python3/pubsub

Ruby

git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
cd ruby-docs-samples/appengine/pubsub

Buat topik dan langganan

Buat topik dan langganan, termasuk menentukan endpoint yang harus dikirimi permintaan oleh server Pub/Sub:

Go

# Configure the topic
gcloud pubsub topics create YOUR_TOPIC_NAME

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

Ganti YOUR_TOKEN dengan token acak rahasia. Endpoint push menggunakannya untuk memverifikasi permintaan.

Untuk menggunakan Pub/Sub dengan autentikasi, buat langganan lain:

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\
    --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

# Your service agent
# `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the
# `iam.serviceAccountTokenCreator` role.
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
    --role='roles/iam.serviceAccountTokenCreator'

Ganti YOUR-SERVICE-ACCOUNT-EMAIL dengan email akun layanan Anda.

Java

# Configure the topic
gcloud pubsub topics create YOUR_TOPIC_NAME

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

Ganti YOUR_TOKEN dengan token acak rahasia. Endpoint push menggunakannya untuk memverifikasi permintaan.

Untuk menggunakan Pub/Sub dengan autentikasi, buat langganan lain:

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\
    --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

# Your service agent
# `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the
# `iam.serviceAccountTokenCreator` role.
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
    --role='roles/iam.serviceAccountTokenCreator'

Ganti YOUR-SERVICE-ACCOUNT-EMAIL dengan email akun layanan Anda.

Node.js

# Configure the topic
gcloud pubsub topics create YOUR_TOPIC_NAME

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

Ganti YOUR_TOKEN dengan token acak rahasia. Endpoint push menggunakannya untuk memverifikasi permintaan.

Untuk menggunakan Pub/Sub dengan autentikasi, buat langganan lain:

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\
    --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

# Your service agent
# `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the
# `iam.serviceAccountTokenCreator` role.
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
    --role='roles/iam.serviceAccountTokenCreator'

Ganti YOUR-SERVICE-ACCOUNT-EMAIL dengan email akun layanan Anda.

PHP

# Configure the topic
gcloud pubsub topics create YOUR_TOPIC_NAME

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

Ganti YOUR_TOKEN dengan token acak rahasia. Endpoint push menggunakannya untuk memverifikasi permintaan.

Untuk menggunakan Pub/Sub dengan autentikasi, buat langganan lain:

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\
    --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

# Your service agent
# `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the
# `iam.serviceAccountTokenCreator` role.
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
    --role='roles/iam.serviceAccountTokenCreator'

Ganti YOUR-SERVICE-ACCOUNT-EMAIL dengan email akun layanan Anda.

Python

# Configure the topic
gcloud pubsub topics create YOUR_TOPIC_NAME

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

Ganti YOUR_TOKEN dengan token acak rahasia. Endpoint push menggunakannya untuk memverifikasi permintaan.

Untuk menggunakan Pub/Sub dengan autentikasi, buat langganan lain:

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\
    --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

# Your service agent
# `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the
# `iam.serviceAccountTokenCreator` role.
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
    --role='roles/iam.serviceAccountTokenCreator'

Ganti YOUR-SERVICE-ACCOUNT-EMAIL dengan email akun layanan Anda.

Ruby

# Configure the topic
gcloud pubsub topics create YOUR_TOPIC_NAME

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

Ganti YOUR_TOKEN dengan token acak rahasia. Endpoint push menggunakannya untuk memverifikasi permintaan.

Untuk menggunakan Pub/Sub dengan autentikasi, buat langganan lain:

# Configure the push subscription
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic=YOUR_TOPIC_NAME \
    --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\
    --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\
    --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \
    --ack-deadline=10

# Your service agent
# `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the
# `iam.serviceAccountTokenCreator` role.
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
    --role='roles/iam.serviceAccountTokenCreator'

Ganti YOUR-SERVICE-ACCOUNT-EMAIL dengan email akun layanan Anda.

Menetapkan variabel lingkungan

Go

Edit file app.yaml guna menetapkan variabel lingkungan untuk topik dan token verifikasi Anda:

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

runtime: go121
env_variables:
    # This token is used to verify that requests originate from your
    # application. It can be any sufficiently random string.
    PUBSUB_VERIFICATION_TOKEN: check123

Java

Edit file app.yaml guna menetapkan variabel lingkungan untuk topik dan token verifikasi Anda:

env_variables:
  PUBSUB_TOPIC: <your-topic-name>
  PUBSUB_VERIFICATION_TOKEN: <your-verification-token>

Node.js

Edit file app.yaml Anda untuk menetapkan variabel lingkungan untuk topik dan token verifikasi:

env_variables:
  PUBSUB_TOPIC: YOUR_TOPIC_NAME
  # This token is used to verify that requests originate from your
  # application. It can be any sufficiently random string.
  PUBSUB_VERIFICATION_TOKEN: YOUR_VERIFICATION_TOKEN

PHP

Edit file index.php untuk menetapkan variabel lingkungan untuk topik dan langganan Anda:

$container->set('topic', 'php-example-topic');
$container->set('subscription', 'php-example-subscription');

Python

Edit file app.yaml guna menetapkan variabel lingkungan untuk project ID, topik, dan token verifikasi Anda:

env_variables:
  PUBSUB_TOPIC: '<YOUR_TOPIC>'
  # This token is used to verify that requests originate from your
  # application. It can be any sufficiently random string.
  PUBSUB_VERIFICATION_TOKEN: '<YOUR_VERIFICATION_TOKEN>'

Ruby

Edit file app.standard.yaml guna menetapkan variabel lingkungan untuk project ID, topik, dan token verifikasi Anda:

env_variables:
    PUBSUB_TOPIC: gaeflex_net_pubsub_auth_push_1
    # This token is used to verify that requests originate from your
    # application. It can be any sufficiently random string.
    PUBSUB_VERIFICATION_TOKEN: abc123

Peninjauan kode

Aplikasi contoh menggunakan Library Klien Pub/Sub.

Go

Aplikasi contoh menggunakan variabel lingkungan yang Anda tetapkan dalam file app.yaml (PUBSUB_TOPIC dan PUBSUB_VERIFICATION_TOKEN) untuk konfigurasi.

Pesan yang diterima oleh instance ini disimpan dalam slice:

messages   []string

Fungsi receiveMessagesHandler menerima pesan yang dikirim, memverifikasi token, dan menambahkan pesan ke slice messages:


// receiveMessagesHandler validates authentication token and caches the Pub/Sub
// message received.
func (a *app) receiveMessagesHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != "POST" {
		http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
		return
	}

	// Verify that the request originates from the application.
	// a.pubsubVerificationToken = os.Getenv("PUBSUB_VERIFICATION_TOKEN")
	if token, ok := r.URL.Query()["token"]; !ok || len(token) != 1 || token[0] != a.pubsubVerificationToken {
		http.Error(w, "Bad token", http.StatusBadRequest)
		return
	}

	// Get the Cloud Pub/Sub-generated JWT in the "Authorization" header.
	authHeader := r.Header.Get("Authorization")
	if authHeader == "" || len(strings.Split(authHeader, " ")) != 2 {
		http.Error(w, "Missing Authorization header", http.StatusBadRequest)
		return
	}
	token := strings.Split(authHeader, " ")[1]
	// Verify and decode the JWT.
	// If you don't need to control the HTTP client used you can use the
	// convenience method idtoken.Validate instead of creating a Validator.
	v, err := idtoken.NewValidator(r.Context(), option.WithHTTPClient(a.defaultHTTPClient))
	if err != nil {
		http.Error(w, "Unable to create Validator", http.StatusBadRequest)
		return
	}
	// Please change http://example.com to match with the value you are
	// providing while creating the subscription.
	payload, err := v.Validate(r.Context(), token, "http://example.com")
	if err != nil {
		http.Error(w, fmt.Sprintf("Invalid Token: %v", err), http.StatusBadRequest)
		return
	}
	if payload.Issuer != "accounts.google.com" && payload.Issuer != "https://accounts.google.com" {
		http.Error(w, "Wrong Issuer", http.StatusBadRequest)
		return
	}

	// IMPORTANT: you should validate claim details not covered by signature
	// and audience verification above, including:
	//   - Ensure that `payload.Claims["email"]` is equal to the expected service
	//     account set up in the push subscription settings.
	//   - Ensure that `payload.Claims["email_verified"]` is set to true.
	if payload.Claims["email"] != "test-service-account-email@example.com" || payload.Claims["email_verified"] != true {
		http.Error(w, "Unexpected email identity", http.StatusBadRequest)
		return
	}

	var pr pushRequest
	if err := json.NewDecoder(r.Body).Decode(&pr); err != nil {
		http.Error(w, fmt.Sprintf("Could not decode body: %v", err), http.StatusBadRequest)
		return
	}

	a.messagesMu.Lock()
	defer a.messagesMu.Unlock()
	// Limit to ten.
	a.messages = append(a.messages, pr.Message.Data)
	if len(a.messages) > maxMessages {
		a.messages = a.messages[len(a.messages)-maxMessages:]
	}

	fmt.Fprint(w, "OK")
}

Java

Tidak ada contoh yang tersedia untuk runtime ini.

Perhatikan bahwa aplikasi demo Java tersedia di lingkungan fleksibel.

Node.js

Aplikasi contoh menggunakan nilai yang Anda tetapkan dalam file app.yaml untuk mengonfigurasi variabel lingkungan. Pengendali permintaan push menggunakan nilai ini untuk mengonfirmasi bahwa permintaan berasal dari Pub/Sub dan berasal dari sumber tepercaya:

// The following environment variables are set by the `app.yaml` file when
// running on App Engine, but will need to be manually set when running locally.
var PUBSUB_VERIFICATION_TOKEN = process.env.PUBSUB_VERIFICATION_TOKEN;
var pubsub = gcloud.pubsub({
    projectId: process.env.GOOGLE_CLOUD_PROJECT
});
var topic = pubsub.topic(process.env.PUBSUB_TOPIC);

Aplikasi contoh mempertahankan daftar global untuk menyimpan pesan yang diterima oleh instance ini:

// List of all messages received by this instance
var messages = [];

Metode ini menerima pesan yang dikirim dan menambahkannya ke daftar global messages:

app.post('/pubsub/push', jsonBodyParser, (req, res) => {
  if (req.query.token !== PUBSUB_VERIFICATION_TOKEN) {
    res.status(400).send();
    return;
  }

  // The message is a unicode string encoded in base64.
  const message = Buffer.from(req.body.message.data, 'base64').toString(
    'utf-8'
  );

  messages.push(message);

  res.status(200).send();
});

Metode ini berinteraksi dengan aplikasi web App Engine untuk memublikasikan pesan baru dan menampilkan pesan yang diterima:

app.get('/', (req, res) => {
  res.render('index', {messages, tokens, claims});
});

app.post('/', formBodyParser, async (req, res, next) => {
  if (!req.body.payload) {
    res.status(400).send('Missing payload');
    return;
  }

  const data = Buffer.from(req.body.payload);
  try {
    const messageId = await topic.publishMessage({data});
    res.status(200).send(`Message ${messageId} sent.`);
  } catch (error) {
    next(error);
  }
});

PHP

Aplikasi contoh menggunakan nilai yang Anda tetapkan dalam file app.yaml untuk mengonfigurasi variabel lingkungan. Pengendali permintaan push menggunakan nilai ini untuk mengonfirmasi bahwa permintaan berasal dari Pub/Sub dan berasal dari sumber tepercaya:

runtime: php81

handlers:
- url: /pubsub\.js
  static_files: pubsub.js
  upload: pubsub\.js

Aplikasi contoh mempertahankan daftar global untuk menyimpan pesan yang diterima oleh instance ini:

$messages = [];

Metode pull akan mengambil pesan dari topik yang Anda buat dan menambahkannya ke daftar pesan:

// get PULL pubsub messages
$pubsub = new PubSubClient([
    'projectId' => $projectId,
]);
$subscription = $pubsub->subscription($subscriptionName);
$pullMessages = [];
foreach ($subscription->pull(['returnImmediately' => true]) as $pullMessage) {
    $pullMessages[] = $pullMessage;
    $messages[] = $pullMessage->data();
}
// acknowledge PULL messages
if ($pullMessages) {
    $subscription->acknowledgeBatch($pullMessages);
}

Metode publish akan memublikasikan pesan baru ke topik:

if ($message = (string) $request->getBody()) {
    // Publish the pubsub message to the topic
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $topic->publish(['data' => $message]);
    return $response->withStatus(204);
}

Python

Aplikasi contoh menggunakan nilai yang Anda tetapkan dalam file app.yaml untuk mengonfigurasi variabel lingkungan. Pengendali permintaan push menggunakan nilai ini untuk mengonfirmasi bahwa permintaan berasal dari Pub/Sub dan berasal dari sumber tepercaya:

app.config['PUBSUB_VERIFICATION_TOKEN'] = \
    os.environ['PUBSUB_VERIFICATION_TOKEN']
app.config['PUBSUB_TOPIC'] = os.environ['PUBSUB_TOPIC']

Aplikasi contoh mempertahankan daftar global untuk menyimpan pesan yang diterima oleh instance ini:

MESSAGES = []

Metode receive_messages_handler() menerima pesan yang dikirim dan menambahkannya ke daftar global MESSAGES:

@app.route("/pubsub/push", methods=["POST"])
def receive_pubsub_messages_handler():
    # Verify that the request originates from the application.
    if request.args.get("token", "") != current_app.config["PUBSUB_VERIFICATION_TOKEN"]:
        return "Invalid request", 400

    envelope = json.loads(request.data.decode("utf-8"))
    payload = base64.b64decode(envelope["message"]["data"])
    MESSAGES.append(payload)
    # Returning any 2xx status indicates successful receipt of the message.
    return "OK", 200

Metode index() berinteraksi dengan aplikasi web App Engine untuk memublikasikan pesan baru dan menampilkan pesan yang diterima:

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template(
            "index.html", messages=MESSAGES, tokens=TOKENS, claims=CLAIMS
        )

    data = request.form.get("payload", "Example payload").encode("utf-8")

    # Consider initializing the publisher client outside this function
    # for better latency performance.
    publisher = pubsub_v1.PublisherClient()
    topic_path = publisher.topic_path(
        app.config["GOOGLE_CLOUD_PROJECT"], app.config["PUBSUB_TOPIC"]
    )
    future = publisher.publish(topic_path, data)
    future.result()
    return "OK", 200

Ruby

Aplikasi contoh menggunakan nilai yang Anda tetapkan dalam file app.standard.yaml untuk mengonfigurasi variabel lingkungan. Pengendali permintaan push menggunakan nilai ini untuk mengonfirmasi bahwa permintaan berasal dari Pub/Sub dan berasal dari sumber tepercaya:

topic = pubsub.topic ENV["PUBSUB_TOPIC"]
PUBSUB_VERIFICATION_TOKEN = ENV["PUBSUB_VERIFICATION_TOKEN"]

Aplikasi contoh mempertahankan daftar global untuk menyimpan pesan yang diterima oleh instance ini:

# List of all messages received by this instance
messages = []

Metode ini menerima pesan yang dikirim dan menambahkannya ke daftar global messages:

post "/pubsub/push" do
  halt 400 if params[:token] != PUBSUB_VERIFICATION_TOKEN

  message = JSON.parse request.body.read
  payload = Base64.decode64 message["message"]["data"]

  messages.push payload
end

Metode ini berinteraksi dengan aplikasi web App Engine untuk memublikasikan pesan baru dan menampilkan pesan yang diterima:

get "/" do
  @claims = claims
  @messages = messages

  slim :index
end

post "/publish" do
  topic.publish params[:payload]

  redirect "/", 303
end

Menjalankan contoh secara lokal

Saat berjalan secara lokal, Anda dapat menggunakan Google Cloud CLI untuk memberikan autentikasi agar dapat menggunakan Google Cloud API. Dengan asumsi Anda menyiapkan lingkungan seperti yang dijelaskan dalam Prasyarat, Anda telah menjalankan perintah gcloud init, yang menyediakan autentikasi ini.

Go

Tetapkan variabel lingkungan sebelum memulai aplikasi Anda:

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-token]
export PUBSUB_TOPIC=[your-topic]
go run pubsub.go

Java

Tetapkan variabel lingkungan sebelum memulai aplikasi Anda:

export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]

Untuk menjalankan aplikasi secara lokal, gunakan alat pengembangan yang biasanya Anda gunakan.

Node.js

Tetapkan variabel lingkungan sebelum memulai aplikasi Anda:

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
npm install
npm start

PHP

Instal dependensi menggunakan Composer:

composer install

Kemudian, tetapkan variabel lingkungan sebelum memulai aplikasi Anda:

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
php -S localhost:8080

Python

Instal dependensi, sebaiknya di lingkungan virtual.

Mac OS/Linux

  1. Buat lingkungan Python yang terisolasi:
    python3 -m venv env
    source env/bin/activate
  2. Jika Anda tidak berada dalam direktori yang berisi kode contoh, buka direktori yang berisi kode contoh hello_world. Kemudian instal dependensi:
    cd YOUR_SAMPLE_CODE_DIR
    pip install -r requirements.txt

Windows

Gunakan PowerShell untuk menjalankan paket Python Anda.

  1. Temukan penginstalan PowerShell Anda.
  2. Klik kanan pintasan PowerShell dan mulai sebagai administrator.
  3. Buat lingkungan Python yang terisolasi.
    python -m venv env
    .\env\Scripts\activate
  4. Buka direktori project Anda lalu instal dependensi. Jika Anda tidak berada dalam direktori yang berisi kode contoh, buka direktori yang berisi kode contoh hello_world. Kemudian, instal dependensi:
    cd YOUR_SAMPLE_CODE_DIR
    pip install -r requirements.txt

Kemudian, tetapkan variabel lingkungan sebelum memulai aplikasi Anda:

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
python main.py

Ruby

Instal dependensi:

bundle install

Kemudian, tetapkan variabel lingkungan sebelum memulai aplikasi Anda:

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
bundle exec ruby app.rb -p 8080

Menyimulasikan notifikasi push

Aplikasi dapat mengirim pesan secara lokal, tetapi tidak dapat menerima pesan push secara lokal. Namun, Anda dapat menyimulasikan pesan push dengan membuat permintaan HTTP ke endpoint notifikasi push lokal. Contoh ini menyertakan file sample_message.json.

Go

Anda dapat menggunakan klien curl atau httpie untuk mengirim permintaan POST HTTP:

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"

Atau

http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json

Respons:

HTTP/1.1 200 OK
Date: Tue, 13 Nov 2018 16:04:18 GMT
Content-Length: 0

Setelah permintaan selesai, Anda dapat memuat ulang localhost:8080 dan melihat pesan dalam daftar pesan yang diterima.

Java

Anda dapat menggunakan klien curl atau httpie untuk mengirim permintaan POST HTTP:

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"

Atau

http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json

Setelah permintaan selesai, Anda dapat memuat ulang localhost:8080 dan melihat pesan dalam daftar pesan yang diterima.

Node.js

Anda dapat menggunakan klien curl atau httpie untuk mengirim permintaan POST HTTP:

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"

Atau

http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json

Respons:

HTTP/1.1 200 OK
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express

Setelah permintaan selesai, Anda dapat memuat ulang localhost:8080 dan melihat pesan dalam daftar pesan yang diterima.

PHP

Anda dapat menggunakan klien curl atau httpie untuk mengirim permintaan POST HTTP:

curl -i --data @sample_message.json "localhost:4567/push-handlers/receive_messages?token=[your-token]"

Atau

http POST ":4567/push-handlers/receive_messages?token=[your-token]" < sample_message.json

Setelah permintaan selesai, Anda dapat memuat ulang localhost:8080 dan melihat pesan dalam daftar pesan yang diterima.

Python

Anda dapat menggunakan klien curl atau httpie untuk mengirim permintaan POST HTTP:

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"

Atau

http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json

Respons:

HTTP/1.0 200 OK
Content-Length: 2
Content-Type: text/html; charset=utf-8
Date: Mon, 10 Aug 2015 17:52:03 GMT
Server: Werkzeug/0.10.4 Python/2.7.10

OK

Setelah permintaan selesai, Anda dapat memuat ulang localhost:8080 dan melihat pesan dalam daftar pesan yang diterima.

Ruby

Anda dapat menggunakan klien curl atau httpie untuk mengirim permintaan POST HTTP:

curl -i --data @sample_message.json "localhost:4567/push-handlers/receive_messages?token=[your-token]"

Atau

http POST ":4567/push-handlers/receive_messages?token=[your-token]" < sample_message.json

Respons:

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: 13
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Server: WEBrick/1.3.1 (Ruby/2.3.0/2015-12-25)
Date: Wed, 20 Apr 2016 20:56:23 GMT
Connection: Keep-Alive

Hello, World!

Setelah permintaan selesai, Anda dapat memuat ulang localhost:8080 dan melihat pesan dalam daftar pesan yang diterima.

Menjalankan di App Engine

Untuk men-deploy aplikasi demo ke App Engine menggunakan alat command line gcloud:

Go

Jalankan perintah berikut dari direktori tempat file app.yaml Anda berada:

gcloud app deploy

Java

Jalankan perintah gcloud dari direktori tempat file app.yaml Anda berada:

gcloud app deploy

Untuk men-deploy aplikasi menggunakan Maven, jalankan perintah berikut:

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

Ganti PROJECT_ID dengan ID project Google Cloud Anda. Jika file pom.xml Anda sudah menentukan project ID, Anda tidak perlu menyertakan properti -Dapp.deploy.projectId dalam perintah yang Anda jalankan.

Node.js

Jalankan perintah berikut dari direktori tempat file app.yaml Anda berada:

gcloud app deploy

PHP

Jalankan perintah berikut dari direktori tempat file app.yaml Anda berada:

gcloud app deploy

Python

Jalankan perintah berikut dari direktori tempat file app.yaml Anda berada:

gcloud app deploy

Ruby

Jalankan perintah berikut dari direktori tempat file app.yaml Anda berada:

gcloud app deploy app.standard.yaml

Anda kini dapat mengakses aplikasi di https://PROJECT_ID.REGION_ID.r.appspot.com. Anda dapat menggunakan formulir ini untuk mengirim pesan, tetapi tidak ada jaminan terkait instance mana dari aplikasi Anda yang akan menerima notifikasi tersebut. Anda dapat mengirim beberapa pesan dan memuat ulang halaman untuk melihat pesan yang diterima.