当我们使用go建立了服务器,那么一种常见的需求就摆在面前。如何给这个服务器的某个路径传递参数呢?我们研究一下URL传参的接收与处理。

对于http.Request发出的请求,我们需要使用到URL.Query().Get(“XXX”)

实例

首先建立一个 dollars 类型,用以保存货币数值。

  1. type dollars float32

对dollars建立一个String()方法,用以确定显示格式

  1. func (d dollars) String() string { return fmt.Sprintf("$%.2f", d) }

建立一个map字典,保存多种东西的价格。

  1. type MyHandler map[string]dollars

在http.Handler中处理路径和接收参数的操作

  1. func (self MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request)

完整代码示例

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "log"
  6. )
  7. type dollars float32
  8. func (d dollars) String() string { return fmt.Sprintf("$%.2f", d) }
  9. type MyHandler map[string]dollars
  10. func (self MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
  11. switch req.URL.Path {
  12. case "/list":
  13. for item, price := range self {
  14. fmt.Fprintf(w, "%s: %s\n", item, price)
  15. }
  16. case "/price":
  17. item := req.URL.Query().Get("item")
  18. //item2 := req.Form.Get("item")
  19. price, ok := self[item]
  20. if !ok {
  21. w.WriteHeader(http.StatusNotFound) // 404
  22. fmt.Fprintf(w, "no such item: %q\n", item)
  23. return
  24. }
  25. fmt.Fprintf(w, "%s\n", price)
  26. default:
  27. w.WriteHeader(http.StatusNotFound) // 404
  28. fmt.Fprintf(w, "no such page: %s\n", req.URL)
  29. }
  30. }
  31. func main() {
  32. handler := MyHandler{"shoes": 50, "socks": 5}
  33. log.Fatal(http.ListenAndServe(":4000", handler))
  34. }

程序运行后,直接访问http://localhost:4000/ 结果如下

  1. no such page: /

访问http://localhost:4000/list 结果如下:

  1. shoes: $50.00
  2. socks: $5.00

访问http://localhost:4000/price 结果如下:

  1. no such item: ""

这个路径是需要正确参数的,所以需要访问http://localhost:4000/price?item=socks 结果如下:

  1. $5.00

http://localhost:4000/price?item=shoes 结果如下
$50.00


web服务器指定路径下的get参数接收与处理 - 图1