跳转到主要内容

【Go语言Web开发】在 Go 中验证 HTTP JSON 请求

在选择您希望如何公开您的 Go 服务时,在 gRPC 和 HTTP 之间进行选择可能是一个相当困难的选择。 gRPC 为您提供了更高性能的网络传输,而围绕它的工具仍然落后于您更标准的基于 HTTP 的 API。

在本教程中,我们将研究如何利用 go-playground/validator 包来提高 API 和 UX 组件的安全性。

gRPC 服务中的验证


我喜欢 gRPC 服务开发的关键之一是通过 protobuf 定义对服务消费者施加的严格性。获得此设置的工具可以说更复杂一些,并且需要更长的时间,但一旦到位,它有助于确保消费者向您发送您期望的有效负载。

HTTP 替代方案


不过值得庆幸的是,有一种方法可以对传入 Go 服务的 HTTP JSON 请求实施某种程度的严格性。我们可以在我们的 HTTP 服务中使用一种称为 JSON 请求验证的技术,它可以有效地确保传入的请求在我们的服务处理之前通过一系列检查。

一个简单的例子


例如,让我们看一下处理诸如配置新用户帐户之类的任务的用户管理系统。我们通常会有一个看起来有点像这样的端点来创建新用户:

【Go语言高级开发】Go 泛型入门 - 教程

泛型。

在 Go 语言中添加泛型必须是 Go 社区最具争议的话题之一。

从一开始,我就喜欢 Go 的明确性和为我作为开发人员提供的简单性。我知道,查看函数签名,我将期望在该函数的主体中使用什么类型,并且我通常会知道要注意什么。

添加泛型后,我们的代码库变得更加复杂。我们不再有那种简单明了的东西,我们必须做一些推理和挖掘才能真正知道传递给我们的新函数的是什么。

概述


现在,本文的目的不是争论该语言最新添加的细节,而是尝试为您提供所需的一切,以便在您自己的 Go 应用程序中启动和运行泛型.

入门


在我们开始之前,您需要在本地机器上安装 go1.18beta1。如果你已经安装了 go,你可以通过运行:

$ go install golang.org/dl/go1.18beta1@latest
$ go1.18beta1 download


成功运行这两个命令后,您应该能够在终端中运行 go1.18beta1:

【Go语言高级开发】使用 WebAssembly 和 Go 编写前端 Web 框架

JavaScript 前端框架无疑有助于突破以前在浏览器上下文中可能实现的界限。越来越复杂的应用程序已经出现在 React、Angular 和 VueJS 之类的基础上,仅举几例,而且有一个众所周知的笑话,即新的前端框架似乎每天都在问世。

然而,这种发展速度对于世界各地的开发者来说是一个非常好的消息。对于每一个新框架,我们都发现了更好的处理状态的方法,或者使用影子 DOM 之类的东西有效地渲染。

然而,最新的趋势似乎是朝着用 JavaScript 以外的语言编写这些框架并将它们编译到 WebAssembly 中。多亏了 Lin Clark 之类的人,我们开始看到 JavaScript 和 WebAssembly 通信方式的重大改进,而且随着 WebAssembly 开始在我们的生活中变得更加突出,我们无疑会看到更多重大改进。

介绍


因此,在本教程中,我认为构建一个非常简单的前端框架的基础是一个好主意,该框架用 Go 编写,可编译成 WebAssembly。至少,这将包括以下功能:

【Go语言高级开发】Go 中的安全编码 - 输入验证

介绍


首先,我要感谢 Elliot Forbes 有机会在这个领域进行合作。我的名字是阿卜杜拉·加西亚。我是一位经验丰富的安全工程师,在广泛的行业领域拥有十多年的成功设计和交付高质量解决方案的经验;对于好奇的人,您可以在 LinkedIn 中找到更多详细信息。我也是一名神经科学家,专注于结合虚拟现实、ML 和假肢的运动神经康复的脑机接口 (BCI)。最后,在业余时间,我喜欢风景/城市/街头摄影(https://abdullahgarcia.myportfolio.com)、旅行、烹饪/烘焙以及各种运动……等等。

本文是几篇文章中的第一篇,其目标是:

  • 了解无论您使用哪种编码语言都适用的通用安全编码最佳实践。
  • 了解使用 Go 编码时如何应对 OWASP 十大(2017)安全风险。

特别是这个:

【Go语言高级开发】Go 指针教程

在本教程中,我们将介绍 Go 中的指针以及如何在自己的 Go 程序中使用它们。我们将介绍最佳实践,并介绍一些最常见的指针用例。

在本教程结束时,您将对指针以及如何使用它们有一个扎实的理解。

介绍


在 Go 中,当我们调用一个函数并将一堆参数传递给该函数时,该语言会创建参数的副本,然后在所述函数中使用这些副本。例如:

main.go

package main

import "fmt"

func myTestFunc(a int) {
    a += 3
    fmt.Println(a)
}

func main() {
    a := 2
    myTestFunc(a)
    fmt.Println(a) // prints out 2
}

在上面的代码中,myTestFunc 接收一个整数变量,并对其进行复制,以便在函数体的上下文中使用。我们对 myTestFunc 中的 a 所做的任何更改都只会保留在 myTestFunc 函数的主体中。

现在,假设我们想调用 myTestFunc 并更新原来的 a 变量并将 3 添加到它?

【Go语言基础】Go Map教程

在本教程中,我们将研究Go中的Map以及如何使用它们来统治世界!

我们将涵盖您需要了解的有关Map的所有内容,以便在您自己的 Go 应用程序中开始使用它们。我们将研究您在 Go 中与Map交互的所有各种方式,在本教程结束时,您将成为使用它们的大师。

Map数据结构


当您需要非常快速的键值查找时,映射是一种非常有用的数据结构。它们的使用方式非常多样化,无论使用何种底层语言,它们都是任何程序员的宝贵工具。

Go 中的 Map 可以被认为相当于 Python 中的 dict 或 Java 中的 HashMap。

Map基本语法


Go 中的映射可以使用 map 关键字后跟键类型和值类型来定义。这些类型可以是 Go 支持的任何基本类型,您可以在 Go 中使用获取Map类型的 make 关键字初始化新Map。

注意:make 内置函数需要一个可选的第二个容量参数,但是对于 Go 中的Map,这将被忽略,因为Map会自动增长和缩小

【Go语言Web开发】 Go Oauth2 教程

欢迎各位码农!在本教程中,我们将了解如何使用 go-oauth2/oauth2 包实现自己的 OAuth2 服务器和客户端。

毫无疑问,这是评论者对我的 YouTube 视频提出的最多要求的话题之一,而且我自己也觉得非常有趣。

毫无疑问,对于任何面向公共甚至私有的服务或 API 而言,安全性都是一个非常重要的特性,并且您需要非常注意它才能使其正确。

注意 - 可以在此处找到本教程的完整 github 存储库:TutorialEdge/go-oauth-tutorial

理论


因此,在我们深入研究如何编写代码之前,了解它在后台是如何工作的很重要。通常,我们有一个客户端,它首先向资源所有者发出授权请求。然后,资源所有者要么同意要么拒绝这个请求。

使用此授权授予,客户端然后将其传递给授权服务器,授权服务器将授予访问令牌。正是有了这个授予的访问令牌,我们的客户端才能访问受保护的资源,例如 API 或服务。

话虽如此,现在让我们看看如何使用这个 go-oauth2/oauth2 包来实现我们自己的授权服务器。

注意 - 如果您有兴趣查看 Oauth2 实现遵循的 RFC,可以在此处找到:RFC-6749

【Go语言开发】Go Tickers 教程

在本教程中,我们将研究 Go 中的代码以及如何在自己的 Go 应用程序中有效地使用代码。

当您需要在给定的时间间隔内重复执行某项操作时,Tickers 非常有用,我们可以将 Tickers 与 goroutines 结合使用,以便在我们的应用程序后台运行这些任务。

行情(Tickers )与计时器


在我们深入研究之前,了解代码和计时器之间的区别很有用。

  • Tickers - 这些非常适合重复任务
  • 计时器(Timers ) - 这些用于一次性任务

一个简单的例子


让我们从一个非常简单的开始,我们每隔 5 秒重复运行一个简单的 fmt.Println 语句。

main.go

【Go语言高级开发】Golang Goroutines 的并发性

现在,Go 是一种令人难以置信的高性能语言,它具有许多强大的功能,可让您构建令人难以置信的快速应用程序。通过为我们提供这些 goroutine 和通道,它重新定义了构建并发程序的意义。

使用 goroutine 是一种非常快速的方法,可以将顺序程序转换为并发程序,而无需担心创建线程或线程池之类的事情。但是,与所有并发编程一样,这会带来一些危险,在你跑来跑去在所有函数调用前面加上 go 关键字之前必须考虑这些危险。

在本教程中,我们将研究如何在基于 Go 的程序中使用 goroutine,并随后提高程序执行的性能。

目标


在本教程结束时,您应该:

  • 对 goroutine 是什么以及如何使用它们来提高应用程序的性能有深入的了解
  • 知道如何创建和使用匿名 goroutine。
  • 了解使您的应用程序并发的一些危险。


视频教程


如果您愿意,本教程还提供视频格式。如果您想支持我的工作,请考虑喜欢并订阅我的 YouTube 频道。

https://youtu.be/ARHXmR0_MGY

【Go语言高级开发】Go Mutex 教程

在编写高并发应用程序时使用 Go 并不会阻止您编写具有竞争条件的系统。 这些竞争条件可能会导致您的系统出现意外问题,这些问题既难以调试,有时甚至更难修复。

因此,我们需要能够编写能够以安全的方式并发执行而不影响性能的 Go 程序。 这就是互斥体发挥作用的地方。

在本教程中,我将向您展示一些您可以在自己的 Go 应用程序中遵循的基本方法,这些方法将帮助您保护您的代码免受这些讨厌的竞争条件的影响。

视频教程


本教程以视频格式提供:

https://youtu.be/cjMdUmfzQWs

理论


在深入研究代码之前,让我们快速了解一下理论以及为什么我们需要互斥锁。

因此,互斥锁或互斥是一种机制,它允许我们防止并发进程进入数据的关键部分,而它已经由给定进程执行。

让我们考虑一个例子,我们有一个银行余额和一个从该银行余额存入和提取资金的系统。在单线程同步程序中,这将非常容易。我们可以通过少量的单元测试有效地保证它每次都能按预期工作。

但是,如果我们开始引入多线程,或者在 Go 的案例中引入多个 goroutine,我们可能会开始在代码中看到问题。