目标
- 改造路由,使其符合restful api规范
简介
在上一章中我们构建了第一个微服务,它的结构如下
我们会发现URL比较奇怪http://127.0.0.1?uid=101
,我们一般会习惯使用类似http://127.0.0.1/uid/101
的格式。
这里我们使用第三方【gorilla/mux】的路由框架,帮助我们快速完成路由的搭建
下载地址:https://github.com/gorilla/mux
源代码
本文中的程序代码:https://github.com/CalvinQiang/go-kit-test
提交点:改造路由,使其符合restful api规范
安装第三方路由
安装方式:
go get -u github.com/gorilla/mux
准备对应的结构
main.go中添加路由规则
package main
import (
"com.calvin.service/endpoint"
"com.calvin.service/service"
"com.calvin.service/transport"
httpTransport "github.com/go-kit/kit/transport/http"
goMux "github.com/gorilla/mux"
"net/http"
)
func main() {
user := service.UserService{}
endPoint := endpoint.GetUserEndPoint(user)
// construct a new server, implements http.handler and wrap the endpoint
serverHandler := httpTransport.NewServer(endPoint, transport.DecodeUserRequest, transport.EncodeUserResponse)
r := goMux.NewRouter() // 这里我们引入了第三方路由
r.Methods("GET").Path(`/user/{uid:\d+}`).Handler(serverHandler) // 设置path格式的路由
// 监听端口,并且使用serverHandler处理随之而来的请求
_ = http.ListenAndServe(":8080", r)
}
改造Transport层
package transport
import (
"com.calvin.service/endpoint"
"context"
"encoding/json"
"errors"
goMux "github.com/gorilla/mux"
"net/http"
"strconv"
)
func DecodeUserRequest(ctx context.Context, r *http.Request) (interface{}, error) {
vars := goMux.Vars(r) // 使用vars方法,提取路由上的参数
if result, ok := vars["uid"]; ok {
uid, _ := strconv.Atoi(result)
return endpoint.UserRequest{Uid: uid}, nil
}
return nil, errors.New("参数错误")
}
func EncodeUserResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
w.Header().Set("Content-type", "application/json")
return json.NewEncoder(w).Encode(response)
}
运行程序
请求路由:http://127.0.0.1:8080/user/101,正常解析
请求http://127.0.0.1:8080/user/1999,正常解析
请求http://127.0.0.1:8080/user1111,找不到预定义的路由
结尾
欢迎关注我的公众号【奇点之心】我会定期我的学习笔记,大家一起加油,一起努力
版权声明:本文为lq8841149原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。