You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.2 KiB
4.2 KiB
LINGYUN.Abp.Dapr.Client.Wrapper
Dapr服务间调用,对包装后的响应结果解包
功能特性
- 自动响应结果包装/解包
- 与ABP包装系统集成
- 自定义包装响应的错误处理
- 支持成功/错误代码配置
- HTTP状态码映射
- 支持自定义响应包装格式
- 灵活的包装控制选项
配置使用
模块按需引用
[DependsOn(typeof(AbpDaprClientModule))]
public class AbpDaprClientWrapperModule : AbpModule
{
}
配置选项
模块使用来自LINGYUN.Abp.Wrapper包的AbpWrapperOptions进行配置:
{
"Wrapper": {
"IsEnabled": true, // 启用/禁用响应包装
"CodeWithSuccess": "0", // 包装响应中的成功代码
"HttpStatusCode": 200, // 包装响应的默认HTTP状态码
"WrapOnError": true, // 是否包装错误响应
"WrapOnSuccess": true // 是否包装成功响应
}
}
实现示例
- 服务定义
public interface IProductService
{
Task<ProductDto> GetAsync(string id);
Task<List<ProductDto>> GetListAsync();
Task<ProductDto> CreateAsync(CreateProductDto input);
}
- 服务实现
public class ProductService : IProductService
{
private readonly DaprClient _daprClient;
public ProductService(DaprClient daprClient)
{
_daprClient = daprClient;
}
public async Task<ProductDto> GetAsync(string id)
{
// 调用会自动处理响应包装
return await _daprClient.InvokeMethodAsync<ProductDto>(
"product-service", // 目标服务ID
$"api/products/{id}", // 方法路径
HttpMethod.Get
);
}
public async Task<List<ProductDto>> GetListAsync()
{
return await _daprClient.InvokeMethodAsync<List<ProductDto>>(
"product-service",
"api/products",
HttpMethod.Get
);
}
public async Task<ProductDto> CreateAsync(CreateProductDto input)
{
return await _daprClient.InvokeMethodAsync<ProductDto>(
"product-service",
"api/products",
HttpMethod.Post,
input
);
}
}
响应格式
当启用包装时,响应将采用以下格式:
{
"code": "0", // 响应代码,默认"0"表示成功
"message": "Success", // 响应消息
"details": null, // 附加详情(可选)
"result": { // 实际响应数据
// ... 响应内容
}
}
错误处理
模块自动处理错误响应:
- 对于包装的响应(带有
AbpWrapResult头):- 解包响应并检查代码
- 如果代码与
CodeWithSuccess不匹配,抛出AbpRemoteCallException - 在异常中包含错误消息、详情和代码
- 支持自定义错误代码映射
- 对于未包装的响应:
- 传递原始响应
- 使用标准HTTP错误处理
- 保持原始错误信息
错误响应示例
{
"code": "ERROR_001",
"message": "产品未找到",
"details": "ID为'123'的产品不存在",
"result": null
}
高级用法
1. 控制响应包装
可以通过HTTP头控制单个请求的响应包装:
// 在请求头中添加
var headers = new Dictionary<string, string>
{
{ "X-Abp-Wrap-Result", "true" }, // 强制启用包装
// 或
{ "X-Abp-Dont-Wrap-Result", "true" } // 强制禁用包装
};
await _daprClient.InvokeMethodAsync<ProductDto>(
"product-service",
"api/products",
HttpMethod.Get,
null,
headers
);
2. 自定义错误处理
public class CustomErrorHandler : IAbpWrapperErrorHandler
{
public Task HandleAsync(AbpWrapperErrorContext context)
{
// 自定义错误处理逻辑
if (context.Response.Code == "CUSTOM_ERROR")
{
// 特殊处理
}
return Task.CompletedTask;
}
}
注意事项
- 响应包装可以通过以下方式控制:
- 配置文件中的全局设置
- HTTP头控制单个请求
- 代码中的动态控制
- 错误响应尽可能保持原始错误结构
- 模块与ABP的远程服务错误处理系统集成
- 建议在微服务架构中统一使用响应包装
- 包装格式可以通过继承
IAbpWrapperResponseBuilder自定义