protobuf cloudevents 集成使用
就是一个简单的示例学习,使用了python
protobuf 定义
- proto
syntax = "proto3";
package cloudevents;
message CloudEvent {
string id = 1;
string source = 2;
string type = 3;
string specversion = 4;
string time = 5;
string datacontenttype = 6;
string data = 7;
}
- 生成代码
protoc --python_out=. cloudevent.proto
fastapi 集成cloudevents模型数据
- fastapi 代码
from fastapi import FastAPI, HTTPException, Request
from cloudevents.http import from_http
app = FastAPI()
@app.post("/cloudevent")
async def receive_cloudevent(request: Request):
try:
print("Received CloudEvent request headers",request.headers)
body = await request.body()
print("Received CloudEvent request body",body)
event = from_http(request.headers, body)
print(f"Received CloudEvent: {event}")
return {"message": "CloudEvent received successfully", "event": event}
except Exception as e:
print(f"Failed to process CloudEvent: {str(e)}")
raise HTTPException(status_code=400, detail=f"Failed to process CloudEvent: {str(e)}")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
- 本地生成protobuf cloudevents 消息
import cloudevent_pb2
import json
import time
import requests
from google.protobuf.json_format import MessageToDict
from cloudevents.http import CloudEvent
from cloudevents.conversion import to_binary
event = cloudevent_pb2.CloudEvent(
id="12345",
source="example.com",
type="com.example.someevent",
specversion="1.0",
time=str(time.time()), # 当前时间戳
datacontenttype="application/json",
data=json.dumps({"message": "Hello, CloudEvents!"}) # 事件的数据
)
# 序列化事件到二进制
serialized_event = event.SerializeToString()
# 假设我们现在接收到事件并反序列化
received_event = cloudevent_pb2.CloudEvent()
received_event.ParseFromString(serialized_event)
# 打印反序列化的事件
print(f"Received CloudEvent ID: {received_event.id}")
print(f"Received CloudEvent Source: {received_event.source}")
print(f"Received CloudEvent Type: {received_event.type}")
print(f"Received CloudEvent Data: {received_event.data}")
# CloudEvent 包装数据
event = CloudEvent(attributes=MessageToDict(received_event), data=json.loads(received_event.data))
# Creates the HTTP request representation of the CloudEvent in structured content mode
headers, body = to_binary(event)
# POST
requests.post("http://localhost:8000/cloudevent", data=body, headers=headers)
说明
以上是一个简单集成测试,主要是记录下
参考资料
https://pypi.org/project/cloudevents/
浙公网安备 33010602011771号