4.5 KiB
4.5 KiB
Context参数优化说明
优化内容
将 ctx context.Context 从 ProcessRequests 方法作为参数传入,而不是在每个 ProcessXXXRequest 方法内部创建。
优化原因
- 更好的上下文管理:可以从上层传递 context,支持超时、取消等操作
- 避免重复代码:不需要在每个方法里都写
ctx := context.Background() - 更好的可追踪性:可以通过 context 传递请求ID、用户ID等元数据
- 符合Go最佳实践:context 应该作为第一个参数传递
修改内容
1. ProcessRequests 方法签名修改
修改前:
func (a *ApiRequestService) ProcessRequests(params []byte, productID string) ([]byte, error) {
var ctx, cancel = context.WithCancel(context.Background())
defer cancel()
修改后:
func (a *ApiRequestService) ProcessRequests(ctx context.Context, params []byte, productID string) ([]byte, error) {
var cancel context.CancelFunc
ctx, cancel = context.WithCancel(ctx)
defer cancel()
2. PreprocessRequestApi 方法修改
修改前:
func (a *ApiRequestService) PreprocessRequestApi(params []byte, apiID string) ([]byte, error) {
if processor, exists := requestProcessors[apiID]; exists {
return processor(a, params)
}
return nil, errors.New("api请求, 未找到相应的处理程序")
}
修改后:
func (a *ApiRequestService) PreprocessRequestApi(ctx context.Context, params []byte, apiID string) ([]byte, error) {
if processor, exists := requestProcessors[apiID]; exists {
return processor(a, ctx, params)
}
return nil, errors.New("api请求, 未找到相应的处理程序")
}
3. requestProcessors map 类型定义修改
修改前:
var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, error){
修改后:
var requestProcessors = map[string]func(*ApiRequestService, context.Context, []byte) ([]byte, error){
4. 所有 ProcessXXXRequest 方法签名修改
修改前:
func (a *ApiRequestService) ProcessYYSYBE08Request(params []byte) ([]byte, error) {
ctx := context.Background()
// ...
}
修改后:
func (a *ApiRequestService) ProcessYYSYBE08Request(ctx context.Context, params []byte) ([]byte, error) {
// 移除了 ctx := context.Background()
// ...
}
5. 错误码提取优化
修改前:
if tianyuanErr, ok := err.(*tianyuanapi.Error); ok {
errorCode = fmt.Sprintf("%d", tianyuanErr.Code)
}
修改后:
if code := tianyuanapi.GetCodeByError(err); code != -1 {
errorCode = fmt.Sprintf("%d", code)
}
修改的方法列表(32个)
所有以下方法都已添加 ctx context.Context 作为第一个参数,并移除了内部的 ctx := context.Background() 声明:
- ProcessPersonEnterpriseProRequest
- ProcessBehaviorRiskScanRequest
- ProcessYYSYBE08Request
- ProcessYYSY09CDRequest
- ProcessFLXG0687Request
- ProcessFLXG3D56Request
- ProcessFLXG0V4BRequest
- ProcessQYGL8271Request
- ProcessIVYZ5733Request
- ProcessIVYZ9A2BRequest
- ProcessJRZQ0A03Request
- ProcessQYGL6F2DRequest
- ProcessJRZQ8203Request
- ProcessJRZQ4AA8Request
- ProcessQCXG7A2BRequest
- ProcessDWBG8B4DRequest
- ProcessDWBG6A2CRequest
- ProcessJRZQ4B6CRequest
- ProcessJRZQ09J8Request
- ProcessJRZQ5E9FRequest
- ProcessQYGL3F8ERequest
- ProcessIVYZ81NCRequest
- ProcessIVYZ7F3ARequest
- ProcessDWBG7F3ARequest
- ProcessJRZQ8A2DRequest
- ProcessYYSY8B1CRequest
- ProcessYYSY7D3ERequest
- ProcessFLXG7E8FRequest
- ProcessIVYZ8I9JRequest
- ProcessJRZQ7F1ARequest
- ProcessIVYZ3P9MRequest
- ProcessJRZQ6F2ARequest
调用方验证
调用方 paySuccessNotify.go 已经正确传递了 ctx:
combinedResponse, err := l.svcCtx.ApiRequestService.ProcessRequests(ctx, decryptData, product.Id)
优势
- 统一的上下文管理:所有API调用共享同一个 context,可以统一控制超时和取消
- 更好的错误追踪:可以在 context 中传递请求ID、用户ID等信息,方便日志追踪
- 代码更简洁:不需要在每个方法中重复创建 context
- 符合Go规范:context 作为第一个参数是 Go 的标准做法
注意事项
- 所有方法现在都依赖外部传入的
ctx,不再内部创建 ProcessRequests方法内部仍然会创建一个带 cancel 的 context,用于控制并发请求的取消- 如果将来需要在 context 中传递元数据(如请求ID、用户ID),可以在调用
ProcessRequests之前设置