1 构建API接口
什么是API接口? API,即应用程序接口,是你的服务与外界交流的窗口。它就像是你服务的门卫,决定了谁可以进来,以及他们可以做什么。通过API接口,用户可以请求数据、提交信息、执行操作等。
如何构建API接口? 在GO语言中,我们可以使用net/http包来轻松构建API接口。让我们来看一个简单的例子:
goCopy code
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Gophers! 👋")
}
func main() {
http.HandleFunc("/hello", helloHandler)
http.ListenAndServe(":8080", nil)
}
API版本控制 在开放API接口时,版本控制是非常重要的。因为一旦你的API发布,可能会有很多用户依赖于它。所以在后续更新中,你需要确保不会破坏现有用户的应用。
你可以通过URL路径或者HTTP Header来控制API版本。比如,可以在URL中加入版本号:
bashCopy code
/v1/hello
过程
- 客户端请求服务器
- HTTP 服务引擎 http.Server 接收到请求,并初步处理成 http.ResponseWriter 和 http.Request 并传递给注册过的上层请求处理
- Handler(实现 ServerHTTP 接口,并注册到 http.ListenAndServe 的 Handler)(即 Gin 的 Engine)
- Engine 把请求数据放入 Context pool 中,并传递给 Engine 的 handleHTTPRequest 进行处理
- handleHTTPRequest 从 trees 中查找对应的 node,并回调注册过的请求处理 Handler
先初始化
// 初始化一个http服务对象
engine := gin.Default()
设置路由
// 设置一个get请求的路由,url为localhost
engine.GET("/", func(c *gin.Context) {
//获取数据
//获取handler处理
//返回数据
c.String(http.StatusOK, "hello World!")
})
监听服务
//监听并启动服务,默认 http://localhost:8080/
engine.Run()
2 用户认证:保护你的服务安全
什么是用户认证? 用户认证是确认用户身份的过程,确保只有合法用户可以访问你的服务。在API开放给公众使用时,用户认证尤为重要,防止未经授权的访问和滥用。
常见的用户认证方式 基本认证:用户通过在请求头中提供用户名和密码进行认证。但是这种方式不够安全,因为密码是明文传输的,容易被截获。 Bearer令牌认证:用户在请求头中使用令牌来认证。令牌通常是由服务器签发的加密字符串,比较安全,不需要传输密码。 OAuth认证:OAuth是一个用于授权的开放标准,允许用户授权第三方应用访问他们的资源。这是常见的社交媒体登录方式。 在GO语言中,可以使用gorilla/mux包来实现路由和jwt-go包来处理JWT令牌。
安装jwt包
go get github.com/dgrijalva/jwt-go
post请求get请求的区别
- GET请求会把请求参数拼接到URL后面,而POST请求则是将请求参数放在请求体中发送。因此,GET请求的请求参数会暴露在URL中,而POST请求的请求参数不会。
- GET请求通常用于请求资源,而POST请求通常用于提交数据。GET请求会向服务器请求一个资源(如HTML页面或者图片),而POST请求则是向服务器提交表单数据或者上传文件等操作。
- GET请求的请求参数长度受到URL长度限制,通常不能超过2048个字符。而POST请求的参数长度通常没有严格限制,可以传输更大的数据量。
- GET请求是幂等的,也就是说,多次相同的GET请求返回的结果应该是一样的。而POST请求不是幂等的,即使发送相同的请求数据,每次响应可能都不同。
GET请求适合用于查询数据,POST请求适合于提交数据。
让我们来看一个示例:
goCopy code
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"github.com/dgrijalva/jwt-go"
)
func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
tokenString := r.Header.Get("Authorization")
if tokenString == "" {
http.Error(w, "未提供令牌", http.StatusUnauthorized)
return
}
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte("your-secret-key"), nil
})
if err != nil || !token.Valid {
http.Error(w, "令牌无效", http.StatusUnauthorized)
return
}
next(w, r)
}
}
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, authenticated Gophers! 👋")
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/hello", authMiddleware(helloHandler))
http.Handle("/", r)
http.ListenAndServe(":8080", nil)
上面的代码实现了一个简单的JWT令牌认证中间件,用户在请求头中提供JWT令牌进行认证。