本文共 3214 字,大约阅读时间需要 10 分钟。
上传回调错误及排除
摘要
总结了SDK/API上传回调的示例、回调服务器的实现示例,说明了上传回调的调试方法,列举了上传回调的常见问题及排除方法。
关于上传回调
OSS在文件上传完成时,可以提供给用户的回调服务器(Callback Server)。在上传请求中携带相应的回调参数,即能实现上传回调。支持上传回调的API接口有:POST /{Bucket}/objects/{ObjectName}。
应用场景
数据流
OSS上传回调流程如下图所示:
-----------1------------> -----------2------------> 客户端(SDK/PostObject) OSS 回调服务器(Callback Server) <----------4------------> <----------3------------
数据流含义
| 数据流 | 含义 | 说明 |
|---|---|---|
| 1 | 上传文件并携带回调参数 | 通过SDK(例如PostObject)完成 |
| 2 | OSS存储文件后发起回调 | OSS向指定的CallbackUrl发起POST请求,回调超时时间为5秒 |
| 3 | 回调服务器返回处理结果 | 回调服务器返回的消息体必须为JSON格式;OSS认为非200请求为回调失败 |
| 4 | OSS返回上传、回调结果 | 上传成功、回调失败返回203,ErrorCode为CallbackFailed,ErrorMessage描述错误原因 |
SDK/PostObject
上传回调参数
| 字段 | 含义 | 说明 |
|---|---|---|
| callbackUrl | 回调服务器地址 | 必选参数 |
| callbackHost | 回调请求消息头中的Host值 | 可选参数,默认为callbackUrl |
| callbackBody | 回调请求的消息体 | 必选参数,内容可以包括系统变量和自定义变量 |
| callbackBodyType | 回调请求消息头中的Content-Type值 | 可选参数,支持application/x-www-form-urlencoded和application/json,默认为前者 |
上传回调参数的携带方式
系统变量及自定义变量
系统变量
| 变量 | 含义 | 说明 |
|---|---|---|
| ${bucket} | 存储空间名称 | 存储空间名称 |
| ${object} | 文件名称 | 文件名称 |
| ${etag} | 文件的ETag | 文件的ETag |
| ${size} | 文件大小 | 文件大小 |
| ${mimeType} | 文件类型 | 文件类型 |
| ${imageInfo.height} | 图片高度 | 图片高度 |
| ${imageInfo.width} | 图片宽度 | 图片宽度 |
| ${imageInfo.format} | 图片格式 | 图片格式 |
自定义变量
回调服务器
回调服务器是一个HTTP服务器,处理OSS发送的回调请求,POST消息。回调服务器的URL即上传回调参数中的callbackUrl。回调服务器是用户自己实现的处理逻辑,实现上传数据的记录、审查、处理、统计等。
回调签名
为了确认收到的POST请求来自于OSS的上传回调,回调服务器需要验证该POST消息的签名。回调签名规则请参看相关文档。
消息处理
回调服务器的主要逻辑如下:
实现示例
回调服务器的实现示例如下:
| 语言 | 示例 | 运行方法 |
|---|---|---|
| Java | 解压后执行java -jar oss-callback-server-demo.jar 9000 | |
| PHP | Apache环境下部署运行 | |
| Python | 解压后执行python callback_app_server.py | |
| Ruby | 执行ruby aliyun_oss_callback_server.rb | |
| Go | 编译后执行aliyun_oss_callback_server | |
| C# | 编译后执行aliyun-oss-net-callback-server.exe 127.0.0.1 80 |
调试步骤
调试客户端
客户端调试时,可使用OSS提供的回调服务器地址,即回调参数中的callbackUrl。该回调服务器只验证回调请求的签名,对回调请求不做处理。对于签名验证成功的回调请求,返回{"Status":"OK"};签名验证失败的回调请求,返回400 Bad Request;非POST请求返回501 Unsupported method。
调试回调服务器
回调服务器是一个支持处理POST请求的HTTP服务器,可以在OSS提供的示例基础上修改,也可以自己独立实现。OSS提供的回调服务器示例:
| 语言 | 示例 | 运行方法 |
|---|---|---|
| Java | 解压后执行java -jar oss-callback-server-demo.jar 9000 | |
| PHP | Apache环境下部署运行 | |
| Python | 解压后执行python callback_app_server.py | |
| Ruby | 执行ruby aliyun_oss_callback_server.rb | |
| Go | 编译后执行aliyun_oss_callback_server | |
| C# | 编译后执行aliyun-oss-net-callback-server.exe 127.0.0.1 80 |
常见错误及原因
InvalidArgument
原因:回调参数设置错误,或参数格式错误。常见的错误是ArgumentValue之间的回调参数,不是有效JSON格式。在JSON中,>、"是转移字符,如"callbackBody":"{"bucket":${bucket),"object":${object}}"应该为"callbackBody":"{\"bucket\":${bucket},\"object\":${object}}"。针对具体的SDK,请参看对应的上传回调示例,详细请参考SDK使用示例部分。
CallbackFailed
原因:
curl -d "<Content>" <CallbackServerURL> -v或抓包确认内容。Windows下推荐使用工具Wireshark抓包,Linux下使用命令tcpdump抓包。总结
本文详细介绍了OSS上传回调的实现方式,包括回调服务器的配置、数据流、SDK使用示例、调试步骤以及常见错误及排除方法。通过合理配置和调试,确保上传回调在实际应用中稳定、高效地运行。
发表评论
最新留言
关于作者