ZBLOG

response := UpdateSubscriptionProcedure(subscriptionID, patchJSON) if response != nil { return http_wrapper.NewResponse(http.StatusOK, nil, response) } else { return http_wrapper.NewResponse(http.StatusNoContent, nil, nil) } 修改下上面UpdateSu...

为了更好地处理 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) // 或者使用其他合适的状态码
}

关键改动:

  1. 自定义响应类型:引入了一个自定义的响应结构体,使得成功与失败的信息更加明确。

  2. 函数返回类型更新UpdateSubscriptionProcedure 返回 UpdateResponse 类型而不是简单的映射。

  3. 调用部分更新:根据新的响应格式调整调用结果处理逻辑。现在可以直接检查 response.Success 并使用相应的数据或错误信息构建 HTTP 响应。

这种设计方式让你能够在处理逻辑中保持一致性,同时也增强了代码可读性和可维护性。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21224

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?