
# 如何定位上传回调失败的问题？
#### 工作原理
OBS 上传回调（Callback）允许在对象上传成功后，OBS 服务端自动向指定的回调 URL 发起 HTTP 请求。SDK 支持以下操作的上传回调：
- [PutObject](https://support.huaweicloud.com/sdk-go-devg-obs/obs_23_0402.html)/ [PutFile](https://support.huaweicloud.com/sdk-go-devg-obs/obs_23_0403.html)
- [CompleteMultipartUpload](https://support.huaweicloud.com/sdk-go-devg-obs/obs_33_0515.html)（合并段完成时）
 
SDK 通过 WithCallbackHeader 扩展参数将回调配置写入 x-obs-callback 请求头，OBS 收到后在上传完成时发起回调。
#### 排查步骤
1. 通过 HTTP 状态码确认回调是否失败。 
   
   | 场景          | 返回状态码      | 说明                   |
   |:---|:---|:---|
   | 上传成功 + 回调成功 | 200        | 正常，可读取 CallbackBody。 |
   | 上传成功 + 回调失败 | 203        | 对象已存储，但回调服务器返回非 200。 |
   | 上传失败        | err != nil | 上传本身失败，回调不会触发。       |
      
   当状态码为 **203** 时，对象已成功上传到 OBS，但回调失败，需按以下步骤继续排查。
   
   
2. 检查回调 URL 是否可达。回调失败最常见的原因是 OBS 服务端无法访问回调 URL，请确认： 
   - URL 必须是公网可访问的 HTTP/HTTPS 地址。
   
   - 回调服务器必须返回 **200** 状态码，否则 OBS 认为回调失败。
   
   
   验证方法： 使用 curl 从外部网络模拟回调请求。
   ```
   curl -X POST http://your-server.com/callback \  
       -H "Content-Type: application/json" \   
       -d '{"bucket":"test","key":"obj","etag":"abc"}' \  
       -v
   ```
   如果 curl 无法连通，说明回调服务不可达，需检查网络配置、防火墙规则或服务是否正常运行。
   
   
3. 检查 CallbackUrl 是否经过 URL 编码。如果 URL 中包含特殊字符（如中文、空格、\&、= 等），必须先进行 URL 编码，否则 OBS 服务端可能无法正确解析回调地址，导致回调失败。
4. 检查回调服务器端的日志。如果回调 URL 可达但仍然失败，需查看回调服务器端的日志，常见问题包括： 
   - **未正确处理数据：** 服务端解析回调请求体时报错，例如未识别 $(bucket) 等模板变量替换后的格式。
   
   - **未返回响应体：** 服务端处理成功但未返回响应内容，或返回了非 200 状态码。
   
   - **网络超时：** 服务端处理耗时过长，导致 OBS 侧回调超时。
   
   
   
   
 
