Golang Web编程的Get和Post请求发送与解析

http://blog.csdn.net/typ2004/article/details/38669949

本文的是一篇入门文章,通过一个简单的例子介绍Golang的Web编程主要用到的技术。

          文章结构包括:

  1. Client-Get 请求 
  2. Client-Post 请求
  3. Server 处理 Get 和 Post 数据

          在数据的封装中,我们部分采用了json,因而本文也涉及到Golang中json的编码和解码。


一、Client-Get


[plain]  view plain  copy
  1. package main  
  2.   
  3. import (  
  4.         "fmt"  
  5.         "net/url"  
  6.         "net/http"  
  7.         "io/ioutil"  
  8.         "log"  
  9. )  
  10.   
  11. func main() {  
  12.         u, _ := url.Parse("http://localhost:9001/xiaoyue")  
  13.         q := u.Query()  
  14.         q.Set("username", "user")  
  15.         q.Set("password", "passwd")  
  16.         u.RawQuery = q.Encode()  
  17.         res, err := http.Get(u.String());  
  18.         if err != nil {   
  19.               log.Fatal(err) return   
  20.         }  
  21.         result, err := ioutil.ReadAll(res.Body)   
  22.         res.Body.Close()   
  23.         if err != nil {   
  24.               log.Fatal(err) return   
  25.         }   
  26.         fmt.Printf("%s", result)  
  27. }   


 

二、Client-Post

[plain]  view plain  copy
  1. package main  
  2.   
  3. import (  
  4.         "fmt"  
  5.         "net/url"  
  6.         "net/http"  
  7.         "io/ioutil"  
  8.         "log"  
  9.         "bytes"  
  10.         "encoding/json"  
  11. )  
  12.   
  13. type Server struct {  
  14.         ServerName string  
  15.         ServerIP   string  
  16. }  
  17.   
  18. type Serverslice struct {  
  19.         Servers []Server  
  20.         ServersID  string  
  21. }  
  22.   
  23.   
  24. func main() {  
  25.   
  26.         var s Serverslice  
  27.   
  28.         var newServer Server;  
  29.         newServer.ServerName = "Guangzhou_VPN";  
  30.         newServer.ServerIP = "127.0.0.1"         
  31.         s.Servers = append(s.Servers, newServer)  
  32.   
  33.         s.Servers = append(s.Servers, Server{ServerName: "Shanghai_VPN", ServerIP: "127.0.0.2"})  
  34.         s.Servers = append(s.Servers, Server{ServerName: "Beijing_VPN", ServerIP: "127.0.0.3"})  
  35.           
  36.         s.ServersID = "team1"  
  37.   
  38.         b, err := json.Marshal(s)  
  39.         if err != nil {  
  40.                 fmt.Println("json err:", err)  
  41.         }  
  42.   
  43.         body := bytes.NewBuffer([]byte(b))  
  44.         res,err := http.Post("http://localhost:9001/xiaoyue", "application/json;charset=utf-8", body)  
  45.         if err != nil {  
  46.                 log.Fatal(err)  
  47.                 return  
  48.         }  
  49.         result, err := ioutil.ReadAll(res.Body)  
  50.         res.Body.Close()  
  51.         if err != nil {  
  52.                 log.Fatal(err)  
  53.                 return  
  54.         }  
  55.         fmt.Printf("%s", result)  
  56. }  


三、Server


[plain]  view plain  copy
  1. package main  
  2.   
  3. import (  
  4.         "fmt"  
  5.         "net/http"  
  6.         "strings"  
  7.         "html"  
  8.         "io/ioutil"  
  9.         "encoding/json"  
  10. )  
  11.   
  12. type Server struct {  
  13.         ServerName string  
  14.         ServerIP   string  
  15. }  
  16.   
  17. type Serverslice struct {  
  18.         Servers []Server  
  19.         ServersID  string  
  20. }  
  21.   
  22. func main() {  
  23.         http.HandleFunc("/", handler)   
  24.         http.ListenAndServe(":9001", nil)  
  25. }  
  26.   
  27. func handler(w http.ResponseWriter, r *http.Request) {   
  28.         r.ParseForm() //解析参数,默认是不会解析的   
  29.         fmt.Fprintf(w, "Hi, I love you %s", html.EscapeString(r.URL.Path[1:]))  
  30.         if r.Method == "GET" {  
  31.                 fmt.Println("method:", r.Method) //获取请求的方法   
  32.   
  33.                 fmt.Println("username", r.Form["username"])   
  34.                 fmt.Println("password", r.Form["password"])   
  35.   
  36.                 for k, v := range r.Form {  
  37.                         fmt.Print("key:", k, "; ")  
  38.                         fmt.Println("val:", strings.Join(v, ""))  
  39.                 }  
  40.         } else if r.Method == "POST" {  
  41.                 result, _:= ioutil.ReadAll(r.Body)  
  42.                 r.Body.Close()  
  43.                 fmt.Printf("%s\n", result)  
  44.   
  45.                 //未知类型的推荐处理方法  
  46.   
  47.                 var f interface{}  
  48.                 json.Unmarshal(result, &f)   
  49.                 m := f.(map[string]interface{})  
  50.                 for k, v := range m {  
  51.                         switch vv := v.(type) {  
  52.                                 case string:  
  53.                                         fmt.Println(k, "is string", vv)  
  54.                                 case int:  
  55.                                         fmt.Println(k, "is int", vv)  
  56.                                 case float64:  
  57.                                         fmt.Println(k,"is float64",vv)  
  58.                                 case []interface{}:  
  59.                                         fmt.Println(k, "is an array:")  
  60.                                         for i, u := range vv {  
  61.                                                 fmt.Println(i, u)  
  62.                                         }  
  63.                                 default:  
  64.                                         fmt.Println(k, "is of a type I don't know how to handle")   
  65.                          }  
  66.                   }  
  67.   
  68.                  //结构已知,解析到结构体  
  69.   
  70.                  var s Serverslice;  
  71.                  json.Unmarshal([]byte(result), &s)  
  72.   
  73.                  fmt.Println(s.ServersID);  
  74.     
  75.                  for i:=0; i<len(s.Servers); i++ {  
  76.                          fmt.Println(s.Servers[i].ServerName)  
  77.                          fmt.Println(s.Servers[i].ServerIP)  
  78.                  }  
  79.         }   
  80. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值