为了更好地处理 UpdateSubscriptionProcedure
函数的返回值并确保在 HTTP 响应中能正确传递信息,我们可以将其返回类型修改为一个自定义结构体,该结构体包含状态、数据和错误信息。这将使得调用该函数时,能够更清晰地知道结果。
以下是改进后的代码示例:
自定义响应结构
首先,我们定义一个自定义的响应结构体,例如 UpdateResponse
:
type UpdateResponse struct {
Success bool `json:"success"`
Data models.NrfSubscriptionData `json:"data,omitempty"`
Error string `json:"error,omitempty"`
}
修改后的 UpdateSubscriptionProcedure
然后,在 UpdateSubscriptionProcedure
中使用这个新的返回类型:
func UpdateSubscriptionProcedure(subscriptionID string, patchJSON []byte) UpdateResponse {
redisDb := db.GetRedisDb()
// 从 Redis 获取原始数据
originalJSON, err := redisDb.HGet("Subscriptions", subscriptionID).Result()
if err != nil {
log.Printf("Error getting original data from Redis: %v", err)
return UpdateResponse{Success: false, Error: "subscription not found"}
}
var original []byte = []byte(originalJSON)
patch, err := jsonpatch.DecodePatch(patchJSON)
if err != nil {
log.Printf("Error decoding JSON patch: %v", err)
return UpdateResponse{Success: false, Error: "invalid patch format"}
}
modified, err := patch.Apply(original)
if err != nil {
log.Printf("Error applying JSON patch: %v", err)
return UpdateResponse{Success: false, Error: "failed to apply patch"}
}
modifiedData := models.NrfSubscriptionData{}
if err := json.Unmarshal(modified, &modifiedData); err != nil {
log.Printf("Error unmarshaling modified data: %v", err)
return UpdateResponse{Success: false, Error: "failed to decode modified data"}
}
result := redisDb.HSet("Subscriptions", subscriptionID, modifiedData)
if result.Err() != nil {
log.Printf("Error saving updated data to Redis: %v", result.Err())
return UpdateResponse{Success: false, Error: "failed to save updated subscription"}
}
return UpdateResponse{Success: true, Data: modifiedData}
}
调用方修改
接着,更新调用该函数的部分,以适应新的返回值类型:
response := UpdateSubscriptionProcedure(subscriptionID, patchJSON)
if response.Success {
return http_wrapper.NewResponse(http.StatusOK, nil, response.Data)
} else {
return http_wrapper.NewResponse(http.StatusBadRequest, nil, response.Error) // 或者使用其他合适的状态码
}
关键改动:
自定义响应类型:引入了一个自定义的响应结构体,使得成功与失败的信息更加明确。
函数返回类型更新:
UpdateSubscriptionProcedure
返回UpdateResponse
类型而不是简单的映射。调用部分更新:根据新的响应格式调整调用结果处理逻辑。现在可以直接检查
response.Success
并使用相应的数据或错误信息构建 HTTP 响应。
这种设计方式让你能够在处理逻辑中保持一致性,同时也增强了代码可读性和可维护性。
内容由零声教学AI助手提供,问题来源于学员提问