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