Angular客户端如何获取后端返回的response.context信息?
Falcon的response.context是框架内部用于中间件或扩展的上下文数据,不会自动随HTTP响应发送给客户端。要把数据大小传递给前端,你需要修改后端代码,把size放到HTTP响应头里,然后前端通过fetch的响应对象读取这个头。
后端修改(Python/Falcon)
在你的响应逻辑里,添加一行把size写入自定义响应头(比如X-Content-Size),同时可以优化重复调用save_to_bytes()的问题:
gltf = create_gltf(vertices, trig_faces, uv) data = b"".join(gltf.save_to_bytes()) data_size = {"size": len(data)} log.info(f"Length of the content is {len(data)}") response.content_type = MEDIA_GLTF # 新增:把size写入自定义响应头 response.set_header('X-Content-Size', str(data_size['size'])) # 复用已生成的data,避免重复序列化 response.data = data response.status = falcon.HTTP_200
注:也可以直接使用标准的Content-Length头,不过自定义头更明确你传递的是业务数据大小。
客户端修改(Angular/fetch)
在fetch的回调流程中,先读取响应头里的size,再获取二进制数据,最后把两者一起传入Observable:
const data$ = new Observable(observer => { fetch(targetUrl.toString(), { method: 'GET' }) .then(response => { // 读取响应头中的size,转成数字类型 const contentSize = parseInt(response.headers.get('X-Content-Size') || '0', 10); // 同时获取二进制数据和size return response.arrayBuffer().then(gltfBuffer => ({ gltfBuffer, contentSize })); }) .then(({ gltfBuffer, contentSize }) => { observer.next({ gltfBuffer, contentSize }); observer.complete(); }) .catch(err => observer.error(err)); }); let result = data$.pipe( map(({ gltfBuffer, contentSize }) => { let gltfObject: any = { 'componentId': componentId, 'gltfBytes': gltfBuffer, 'contentSize': contentSize // 保存获取到的size信息 }; this.surfaceMeshesGltf.set(surfaceMeshKey, gltfObject); }) ); return result;
注:你之前在fetch的headers里配置responseType是错误的——这是Axios的配置项,fetch中直接调用response.arrayBuffer()即可获取二进制数据。
跨域场景补充
如果你的前端和后端处于跨域环境,需要确保Falcon服务器允许前端读取自定义头X-Content-Size。可以通过CORS中间件配置:
from falcon_cors import CORS cors = CORS( allow_all_origins=True, expose_headers=['X-Content-Size'] # 关键:暴露自定义头给前端 ) # 将CORS中间件添加到Falcon应用 app = falcon.App(middleware=[cors.middleware])
内容的提问来源于stack exchange,提问作者GeekAndNerd223
相关产品推荐
相关产品推荐

