我必须先道歉,因为我刚刚开始使用 Pub/Sub,所以我可能缺乏对 GCP 功能的理解。
我正在尝试调整 Google 自己的 Python 脚本,用于在 Cloud Run (https://cloud.google.com/run/docs/triggering/pubsub-push#run_pubsub_handler-python) 中接收来自 Pub/Sub 的消息:
@app.route("/", methods=["POST"])
def index():
envelope = request.get_json()
if not envelope:
msg = "no Pub/Sub message received"
print(f"error: {msg}")
return f"Bad Request: {msg}", 400
if not isinstance(envelope, dict) or "message" not in envelope:
msg = "invalid Pub/Sub message format"
print(f"error: {msg}")
return f"Bad Request: {msg}", 400
pubsub_message = envelope["message"]
name = "World"
if isinstance(pubsub_message, dict) and "data" in pubsub_message:
name = base64.b64decode(pubsub_message["data"]).decode("utf-8").strip()
print(f"Hello {name}!")
return ("", 204)
现在我使用的 Pub/Sub 主题有一个 AVRO 架构,如:
{
"type": "record",
"name": "Avro",
"fields": [
{
"name": "ext_file_id",
"type": "string"
},
{
"name": "input_bucket",
"type": "string"
}
]
}
我需要在 Cloud Run(我的 Python 脚本)中做的是获取 JSON 正文键(ext_file_id 和 input_bucket)及其值。
考虑到我通过以下方式获得 JSON:
envelope = request.get_json()
它会不会是这样的:
envlope.body.ext_file_id
envelope.body.input_bucket
或者别的什么?
我尝试了以下方法无济于事:
envelope["ext_file_id"]
envelope["input_bucket"]
答案 0 :(得分:2)
当您从 PubSub 收到 JSON 时,您会收到一个带有 message
字段的 JSON,其中包含此 format
{
"data": string,
"attributes": {
string: string,
...
},
"messageId": string,
"publishTime": string,
"orderingKey": string
}
您的消息在代码中的 data
字段中以 base64 编码
pubsub_message["data"]).decode("utf-8")
然后你必须对这个内容进行 JSON 解析(json.loads(data)
),然后得到你想要的字段。