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 di antara aplikasi. Aplikasi penayang dapat mengirim pesan ke topik, dan aplikasi lain dapat berlangganan topik tersebut untuk menerima pesan.

Dokumen ini mendeskripsikan 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

v1.18 dan yang lebih baru

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git
    cd golang-samples/appengine_flexible/pubsub

v1.15 dan yang lebih lama

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git
    cd golang-samples/appengine_flexible/go115_and_earlier/pubsub

Java

versi 11/17

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/flexible/java-11/pubsub/

versi 8

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/flexible/java-8/pubsub/

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

v3.8 dan yang lebih baru

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

v3.7 dan yang lebih lama

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

Ruby

versi 3.2

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

versi 3.1 dan yang lebih lama

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

.NET

versi 6

git clone  https://github.com/GoogleCloudPlatform/dotnet-docs-samples
cd dotnet-docs-samples/appengine/flexible/Pubsub/Pubsub.Sample

versi 3.1 dan yang lebih lama

git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples
git checkout flex-dotnet3-and-earlier
cd dotnet-docs-samples/appengine/flexible/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 Google-managed service account
# `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 Google-managed service account
# `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 Google-managed service account
# `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 Google-managed service account
# `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 Google-managed service account
# `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 Google-managed service account
# `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 akun layanan email Anda.

.NET

# 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 secret. 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 Google-managed service account
# `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:

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-token

Java

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

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>

Node.js

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

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: 1234abc

Ruby

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

env_variables:
    PUBSUB_TOPIC: <pubsub-topic-name>
    # This token is used to verify that requests originate from your
    # application. It can be any sufficiently random string.
    PUBSUB_VERIFICATION_TOKEN: <verification-token>

.NET

versi 6

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

runtime: aspnetcore
env: flex

runtime_config:
  operating_system: ubuntu22

env_variables:
  TEST_PROJECT_ID: your-project-id
  TEST_VERIFICATION_TOKEN: your-token
  TEST_TOPIC_ID: your-topic
  TEST_SUBSCRIPTION_ID: your-sub
  TEST_AUTH_SUBSCRIPTION_ID: your-auth-sub
  TEST_SERVICE_ACCOUNT_EMAIL: your-service-account-email

versi 3.1 dan yang lebih lama

Edit file appsettings.json untuk menetapkan project ID Anda:

{
  "Pubsub": {
    "ProjectId": "your-project-id",
    "VerificationToken": "your-secret-token",
    "TopicId": "your-topic",
    "SubscriptionId": "your-subscription",
    "AuthSubscriptionId": "your-auth-subscription",
    "ServiceAccountEmail": "your-service-account-email"
  },

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

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 pushHandler menerima pesan yang dikirim, memverifikasi token, dan menambahkan pesan ke slice messages:


func pushHandler(w http.ResponseWriter, r *http.Request) {
	// Verify the token.
	if r.URL.Query().Get("token") != token {
		http.Error(w, "Bad token", http.StatusBadRequest)
		return
	}
	msg := &pushRequest{}
	if err := json.NewDecoder(r.Body).Decode(msg); err != nil {
		http.Error(w, fmt.Sprintf("Could not decode body: %v", err), http.StatusBadRequest)
		return
	}

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

Fungsi publishHandler menayangkan pesan baru ke topik.


func publishHandler(w http.ResponseWriter, r *http.Request) {
	ctx := context.Background()

	msg := &pubsub.Message{
		Data: []byte(r.FormValue("payload")),
	}

	if _, err := topic.Publish(ctx, msg).Get(ctx); err != nil {
		http.Error(w, fmt.Sprintf("Could not publish message: %v", err), 500)
		return
	}

	fmt.Fprint(w, "Message published.")
}

Java

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:

String pubsubVerificationToken = System.getenv("PUBSUB_VERIFICATION_TOKEN");

Aplikasi contoh mempertahankan instance database Cloud Datastore untuk menyimpan pesan. Servlet PubSubPush menerima pesan yang dikirim dan menambahkannya ke instance database messageRepository:

versi 11/17

@WebServlet(value = "/pubsub/push")
@MultipartConfig()
public class PubSubPush extends HttpServlet {

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    String pubsubVerificationToken = System.getenv("PUBSUB_VERIFICATION_TOKEN");
    // Do not process message if request token does not match pubsubVerificationToken
    if (pubsubVerificationToken == null
        || pubsubVerificationToken.compareTo(req.getParameter("token")) != 0) {
      resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
      return;
    }
    // parse message object from "message" field in the request body json
    // decode message data from base64
    Message message = getMessage(req);
    try {
      messageRepository.save(message);
      // 200, 201, 204, 102 status codes are interpreted as success by the Pub/Sub system
      resp.setStatus(HttpServletResponse.SC_OK);
    } catch (Exception e) {
      System.out.println(e);
      resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
  }

versi 8

@WebServlet(value = "/pubsub/push")
public class PubSubPush extends HttpServlet {

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    String pubsubVerificationToken = System.getenv("PUBSUB_VERIFICATION_TOKEN");
    // Do not process message if request token does not match pubsubVerificationToken
    if (req.getParameter("token").compareTo(pubsubVerificationToken) != 0) {
      resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
      return;
    }
    // parse message object from "message" field in the request body json
    // decode message data from base64
    Message message = getMessage(req);
    try {
      messageRepository.save(message);
      // 200, 201, 204, 102 status codes are interpreted as success by the Pub/Sub system
      resp.setStatus(HttpServletResponse.SC_OK);
    } catch (Exception e) {
      resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
  }

Servlet PubSubPublish berinteraksi dengan aplikasi web App Engine untuk memublikasikan pesan baru dan menampilkan pesan yang diterima:

@WebServlet(name = "Publish with PubSub", value = "/pubsub/publish")
public class PubSubPublish extends HttpServlet {

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    Publisher publisher = this.publisher;
    try {
      String topicId = System.getenv("PUBSUB_TOPIC");
      // create a publisher on the topic
      if (publisher == null) {
        publisher = Publisher.newBuilder(
            ProjectTopicName.of(ServiceOptions.getDefaultProjectId(), topicId))
            .build();
      }
      // construct a pubsub message from the payload
      final String payload = req.getParameter("payload");
      PubsubMessage pubsubMessage =
          PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8(payload)).build();

      publisher.publish(pubsubMessage);
      // redirect to home page
      resp.sendRedirect("/");
    } catch (Exception e) {
      resp.sendError(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage());
    }
  }

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: php
env: flex

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 pubsub_push() menerima pesan yang dikirim dan menambahkannya ke daftar global MESSAGES:

@app.route("/pubsub/push", methods=["POST"])
def pubsub_push():
    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)

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

    # publisher = pubsub_v1.PublisherClient()
    topic_path = publisher.topic_path(
        current_app.config["PROJECT"], current_app.config["PUBSUB_TOPIC"]
    )

    publisher.publish(topic_path, data=data)

    return "OK", 200

Ruby

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:

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

.NET

versi 6

[HttpGet]
[HttpPost]
public async Task<IActionResult> IndexAsync(MessageForm messageForm)
{
    var model = new MessageList();
    if (!_options.HasGoodProjectId())
    {
        model.MissingProjectId = true;
        return View(model);
    }
    if (!string.IsNullOrEmpty(messageForm.Message))
    {
        // Publish the message.
        var pubsubMessage = new PubsubMessage()
        {
            Data = ByteString.CopyFromUtf8(messageForm.Message)
        };
        pubsubMessage.Attributes["token"] = _options.VerificationToken;
        await _publisher.PublishAsync(pubsubMessage);
        model.PublishedMessage = messageForm.Message;
    }
    // Render the current list of messages.
    model.Messages = s_receivedMessages.ToArray();
    model.AuthMessages = s_authenticatedMessages.ToArray();
    return View(model);
}

versi 3.1 dan yang lebih lama

[HttpGet]
[HttpPost]
public IActionResult Index(MessageForm messageForm)
{
    var model = new MessageList();
    if (!_options.HasGoodProjectId())
    {
        model.MissingProjectId = true;
        return View(model);
    }
    if (!string.IsNullOrEmpty(messageForm.Message))
    {
        // Publish the message.
        var pubsubMessage = new PubsubMessage()
        {
            Data = ByteString.CopyFromUtf8(messageForm.Message)
        };
        pubsubMessage.Attributes["token"] = _options.VerificationToken;
        _publisher.PublishAsync(pubsubMessage);
        model.PublishedMessage = messageForm.Message;
    }
    // Render the current list of messages.
    model.Messages = s_receivedMessages.ToArray();
    model.AuthMessages = s_authenticatedMessages.ToArray();
    return View(model);
}

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

mvn clean package

Tetapkan variabel lingkungan sebelum memulai aplikasi Anda:

export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
mvn jetty:run

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

.NET

Jalankan perintah berikut dari direktori root aplikasi Anda:

    dotnet restore
    dotnet run

Di browser web Anda, masukkan http://localhost:5000/. Untuk keluar dari server web, tekan Ctrl+C di jendela terminal Anda.

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

Respons:

HTTP/1.1 200 OK
Date: Wed, 26 Apr 2017 00:03:28 GMT
Content-Length: 0
Server: Jetty(9.3.8.v20160314)

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.

.NET

Untuk mengirim permintaan HTTP POST:

Get-Content -Raw .\sample_message.json | Invoke-WebRequest -Uri
http://localhost:5000/Push?token=your-secret-token -Method POST -ContentType
'text/json' -OutFile out.txt

Setelah permintaan selesai, Anda dapat memuat ulang localhost:5000 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

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 sudah menentukan project ID, Anda tidak perlu menyertakan properti -Dapp.deploy.projectId dalam perintah yang dijalankan singkat ini.

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.yaml

.NET

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

gcloud app deploy

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.