gorilla/mux实现http服务示例

ゝ一世哀愁。 2022-06-02 06:38 223阅读 0赞

gorilla/mux 小巧玲珑而十分高效,兼容go自带的http。下载源码到本地,编写如下示例:

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gorilla/mux"
  6. "io/ioutil"
  7. "net/http"
  8. "runtime/debug"
  9. "time"
  10. )
  11. //错误码常量
  12. const (
  13. INVALID_BODY = 1
  14. INVALID_PARA = 2
  15. INNER_ERROR = 3
  16. )
  17. //请求包体
  18. type Req struct {
  19. Msg string `json:"msg"`
  20. }
  21. //回复包体
  22. type Rsp struct {
  23. Status int64 `json:"status"`
  24. Msg string `json:"msg"`
  25. Data interface{} `json:"data,omitempty"`
  26. }
  27. //路由器
  28. var Router *mux.Router
  29. type Process func(query map[string][]string, body []byte, rsp *Rsp)
  30. func GenHandler(pro Process) func(w http.ResponseWriter, r *http.Request) {
  31. return func(w http.ResponseWriter, r *http.Request) {
  32. //url param
  33. query := r.URL.Query()
  34. //post data
  35. sbody, e := ioutil.ReadAll(r.Body)
  36. defer r.Body.Close()
  37. if e != nil {
  38. w.WriteHeader(500)
  39. return
  40. }
  41. //process
  42. var rsp Rsp
  43. fmt.Printf("Req : %v\n", string(sbody))
  44. pro(query, sbody, &rsp)
  45. fmt.Printf("Rsp : %d, %v\n", rsp.Status, rsp.Data)
  46. //rsp
  47. buf, e := json.Marshal(&rsp)
  48. if e != nil {
  49. w.WriteHeader(500)
  50. }
  51. w.Write([]byte(buf))
  52. }
  53. }
  54. //服务
  55. func ProcessEcho(query map[string][]string, body []byte, rsp *Rsp) {
  56. //解析url参数
  57. var isEcho bool
  58. echo := query["echo"]
  59. if echo != nil {
  60. //整型值使用strconv转换
  61. //state, e := strconv.ParseInt(echo[0], 10, 32)
  62. if echo[0] == "true" {
  63. isEcho = true
  64. } else {
  65. isEcho = false
  66. }
  67. }
  68. //解析post数据
  69. var req Req
  70. if e := json.Unmarshal(body, &req); e != nil {
  71. fmt.Printf("unmarshal fail %v [%v]\n", e, string(body))
  72. rsp.Status = INVALID_BODY
  73. rsp.Msg = "Invalid Req Body"
  74. return
  75. }
  76. //其他服务操作
  77. //回复数据
  78. if isEcho {
  79. rsp.Data = req.Msg
  80. }
  81. return
  82. }
  83. func main() {
  84. defer func() {
  85. if err := recover(); err != nil {
  86. debug.PrintStack()
  87. }
  88. }()
  89. Router = mux.NewRouter()
  90. //cgi router
  91. Router.HandleFunc("/echo_svr", GenHandler(ProcessEcho))
  92. svr := http.Server{
  93. Addr: ":38080",
  94. ReadTimeout: 3 * time.Second,
  95. WriteTimeout: 3 * time.Second,
  96. Handler: Router,
  97. }
  98. svr.ListenAndServe()
  99. }

这个示例足够满足大多数的人的http服务需求,更复杂的需求,参考mux官网使用范例。

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Nginx实现Http服务

    一 概述 Nginx的默认端口为80端口。Http服务是指通过Http服务来访问资源,如当我们的图片存放在目录/opt/temp/images中,对于普通的图片而言是无法