Go 函数装饰器模式教程( 二 )

注意:这绝对不是保护 REST API 的正确方法 , 我建议您考虑使用 JWT 或 OAuth2 来实现该目标!
所以 , 让我们分解一下并尝试了解发生了什么!
我们创建了一个名为的新装饰器函数isAuthorized() , 它接收一个与原始homePage函数具有相同签名的函数 。然后返回一个http.Handler.
在我们的isAuthorized()函数体中 , 我们返回一个 new http.HandlerFunc来验证我们的Authorized header的工作是 set 和 equals true 。现在 , 这是一个大大简化的版本OAuth2身份验证/授权 , 有一些细微的差异 , 但它让您大致了解它是如何工作的 。
然而 , 要注意的关键是我们已经设法装饰现有端点并在所述端点周围添加某种形式的身份验证 , 而无需更改该功能的现有实现 。
现在 , 如果我们要添加一个我们想要保护的新端点 , 我们可以轻松地这样做:
// define our newEndpoint function. Notice how, yet again,// we don't do any authentication based stuff in the body// of this functionfunc newEndpoint(w http.ResponseWriter, r *http.Request) {fmt.Println("My New Endpoint")fmt.Fprintf(w, "My second endpoint")}func handleRequests() {http.Handle("/", isAuthorized(homePage))// register our /new endpoint and decorate our// function with our isAuthorized Decoratorhttp.Handle("/new", isAuthorized(newEndpoint))log.Fatal(http.ListenAndServe(":8081", nil))}这突出了装饰器模式的主要优点 , 在我们的代码库中包装代码非常简单 。我们可以使用相同的方法轻松添加新的经过身份验证的端点
结论希望本教程有助于揭开装饰器的神秘面纱 , 以及如何在自己的基于 Go 的程序中使用装饰器模式 。我们了解了装饰器模式的好处以及如何使用它来用新功能包装现有功能 。
在本教程的第二部分 , 我们查看了一个更现实的示例 , 说明如何在自己的生产级 Go 系统中使用它 。
如果您喜欢本教程 , 请随时广泛分享这篇文章 , 它确实对网站有帮助 , 我将不胜感激!如果您有任何问题和/或意见 , 请在下面的评论部分告诉我!




推荐阅读