Voltar ao blog

Flame Blog

Como publicar manualmente mensagens no emulador Pub/Sub

Chamando o emulador Pub/Sub diretamente via API HTTP.

Publicado em 24 de abril de 2026

Por Val — Artigo original escrito em inglês

Quando você define funções Pub/Sub, um tópico correspondente é provisionado automaticamente no emulador.

export const pubsubFunction = functions.pubsub.onMessagePublished(
  { topic: 'my-topic' },
  event => {
    console.log({ event, json: event.data.message.json })
  }
)
export const pubsubFunction = functions.pubsub
  .topic('my-topic')
  .onPublish(message => {
    console.log({ message, json: message.json })
  })

O emulador Pub/Sub roda por padrão na porta 8085 e você pode publicar mensagens nele usando o SDK Pub/Sub na sua linguagem favorita, por exemplo:

import { PubSub } from '@google-cloud/pubsub'

const pubsub = new PubSub({
  projectId: 'my-project',
  apiEndpoint: 'localhost:8085',
})

// Também é possível usar um construtor vazio com as variáveis de ambiente
// `GOOGLE_CLOUD_PROJECT` e `PUBSUB_EMULATOR_HOST` definidas.
// const pubsub = new PubSub()

const topic = pubsub.topic('my-topic')

await topic.publishMessage({
  json: {
    foo: 'bar',
  },
})

Mas neste artigo eu quero entrar em detalhes e mostrar como usar a API HTTP do emulador diretamente.

Publicar uma mensagem

Para publicar uma mensagem em um tópico, use o endpoint :publish:

curl -X POST 'http://127.0.0.1:8085/v1/projects/my-project/topics/my-topic:publish' \
  -H 'Content-Type: application/json' \
  -d '{"messages": [{"data": "eyJmb28iOiJiYXIifQ=="}]}'

O campo data dentro de cada mensagem deve ser codificado em Base64. Aqui, o payload é {"foo": "bar"}.

Buffer.from(JSON.stringify({ foo: 'bar' })).toString('base64')
// 'eyJmb28iOiJiYXIifQ=='

Para lidar com a codificação Base64 no mesmo comando, podemos fazer o seguinte:

curl -X POST 'http://127.0.0.1:8085/v1/projects/my-project/topics/my-topic:publish' \
  -H 'Content-Type: application/json' \
  -d '{"messages": [{"data": "'$(echo '{"foo": "bar"}' | base64)'"}]}'

Você também pode incluir atributos de mensagem:

curl -X POST "http://127.0.0.1:8085/v1/projects/my-project/topics/my-topic:publish" \
  -H "Content-Type: application/json" \
  -d '{
  "messages": [
    {
      "data": "eyJmb28iOiJiYXIifQ==",
      "attributes": {
        "foo": "bar"
      }
    }
  ]
}'

O endpoint retornará os IDs das mensagens publicadas:

{
  "messageIds": ["1"]
}

Chamar a função subjacente diretamente

Se você quiser ignorar completamente o emulador Pub/Sub e chamar diretamente a função por trás do tópico, confira nosso guia dedicado para chamar funções do emulador Firebase.

Pare de adivinhar com Flame ✨

Talvez você não queira se preocupar com comandos cURL e codificação Base64 ao depurar suas funções Pub/Sub.

É por isso que construímos o Flame, uma interface de usuário para o emulador Firebase com tudo o que falta em localhost:4000.

Veja todos os seus tópicos Pub/Sub e filas de tarefas de uma só vez, componha mensagens com uma interface amigável, e publique diretamente no emulador. Sem codificação Base64 necessária.

Tópicos Pub/Sub e composição de mensagens no Flame

O Flame oferece a interface Pub/Sub que falta em localhost:4000, e também vem com uma interface melhorada para Firebase Auth, Firestore, Functions, e mais.

Se isso parece interessante para você, experimente o Flame!