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

chengmodelong · · 1377 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

文章结构包括:

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

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

一、Client-Get

package main

import (
  "fmt"
  "net/url"
  "net/http"
  "io/ioutil"
  "log"
)

func main() {
  u, _ := url.Parse("http://localhost:9001/xiaoyue")
  q := u.Query()
  q.Set("username", "user")
  q.Set("password", "passwd")
  u.RawQuery = q.Encode()
  res, err := http.Get(u.String());
  if err != nil { 
        log.Fatal(err) return 
  }
  result, err := ioutil.ReadAll(res.Body) 
  res.Body.Close() 
  if err != nil { 
        log.Fatal(err) return 
  } 
  fmt.Printf("%s", result)
} 

二、Client-Post

package main

import (
  "fmt"
  "net/url"
  "net/http"
  "io/ioutil"
  "log"
  "bytes"
  "encoding/json"
)

type Server struct {
  ServerName string
  ServerIP   string
}

type Serverslice struct {
  Servers []Server
  ServersID  string
}


func main() {

  var s Serverslice

  var newServer Server;
  newServer.ServerName = "Guangzhou_VPN";
  newServer.ServerIP = "127.0.0.1"       
  s.Servers = append(s.Servers, newServer)

  s.Servers = append(s.Servers, Server{ServerName: "Shanghai_VPN", ServerIP: "127.0.0.2"})
  s.Servers = append(s.Servers, Server{ServerName: "Beijing_VPN", ServerIP: "127.0.0.3"})
  
  s.ServersID = "team1"

  b, err := json.Marshal(s)
  if err != nil {
    fmt.Println("json err:", err)
  }

  body := bytes.NewBuffer([]byte(b))
  res,err := http.Post("http://localhost:9001/xiaoyue", "application/json;charset=utf-8", body)
  if err != nil {
    log.Fatal(err)
    return
  }
  result, err := ioutil.ReadAll(res.Body)
  res.Body.Close()
  if err != nil {
    log.Fatal(err)
    return
  }
  fmt.Printf("%s", result)
}
package main

import (
  "fmt"
  "net/http"
  "strings"
  "html"
  "io/ioutil"
  "encoding/json"
)

type Server struct {
  ServerName string
  ServerIP   string
}

type Serverslice struct {
  Servers []Server
  ServersID  string
}

func main() {
  http.HandleFunc("/", handler) 
  http.ListenAndServe(":9001", nil)
}

func handler(w http.ResponseWriter, r *http.Request) { 
  r.ParseForm() //解析参数,默认是不会解析的 
  fmt.Fprintf(w, "Hi, I love you %s", html.EscapeString(r.URL.Path[1:]))
  if r.Method == "GET" {
    fmt.Println("method:", r.Method) //获取请求的方法 

    fmt.Println("username", r.Form["username"]) 
    fmt.Println("password", r.Form["password"]) 

    for k, v := range r.Form {
      fmt.Print("key:", k, "; ")
      fmt.Println("val:", strings.Join(v, ""))
    }
  } else if r.Method == "POST" {
    result, _:= ioutil.ReadAll(r.Body)
    r.Body.Close()
    fmt.Printf("%s\n", result)

    //未知类型的推荐处理方法

    var f interface{}
    json.Unmarshal(result, &f) 
    m := f.(map[string]interface{})
    for k, v := range m {
      switch vv := v.(type) {
        case string:
          fmt.Println(k, "is string", vv)
        case int:
          fmt.Println(k, "is int", vv)
        case float64:
          fmt.Println(k,"is float64",vv)
        case []interface{}:
          fmt.Println(k, "is an array:")
          for i, u := range vv {
            fmt.Println(i, u)
          }
        default:
          fmt.Println(k, "is of a type I don't know how to handle") 
       }
      }

     //结构已知,解析到结构体

     var s Serverslice;
     json.Unmarshal([]byte(result), &s)

     fmt.Println(s.ServersID);
  
     for i:=0; i<len(s.Servers); i++ {
       fmt.Println(s.Servers[i].ServerName)
       fmt.Println(s.Servers[i].ServerIP)
     }
  } 
}

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:chengmodelong

查看原文:Golang Web编程的Get和Post请求发送与解析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1377 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传