Go处理请求参数

433 次浏览次阅读
没有评论

Go 处理请求参数并响应 JSON 格式数据

GET 和 POST 是我们最常用的两种请求方式,Go 接受 GET 和 POST 参数方式。

处理 GET 请求

接受 GET 参数

package main

import (
    "log"
    "net/http"
)

func GetHandler(w http.ResponseWriter, r *http.Request) {query := r.URL.Query()

    // 第一种方式
    // name := query["name"][0]

    // 第二种方式
    name := query.Get("name")

    log.Printf("GET: name=%s\n", name)
}

func main() {http.HandleFunc("/get", GetHandler)
    log.Println("Running at port 8899 ...")

    err := http.ListenAndServe(":8899", nil)
    if err != nil {log.Fatal("ListenAndServe: ", err.Error())
    }

}
package main

import (
    "log"
    "net/http"
)

func GetHandler(w http.ResponseWriter, r *http.Request) {m := make(map[string]string)
    query := r.URL.Query()
    for k, v := range query {m[k] = v[0]
    }
    log.Println(m)
}

func main() {http.HandleFunc("/get", GetHandler)
    log.Println("Running at port 8899 ...")

    err := http.ListenAndServe(":8899", nil)
    if err != nil {log.Fatal("ListenAndServe: ", err.Error())
    }

}

处理路径参数

example:
127.0.0.1:9090/t/loveyou.md

filename := strings.TrimPrefix(r.URL.Path, "/t/")

处理 POST 请求

接受 POST 请求参数. 常见两种模式,分别为 application/json 和 application/x-www-form-urlencoded

1. 接收 application/x-www-form-urlencoded 类型的 POST 请求

package main

import (
    "fmt"
    "log"
    "net/http"
)

func PostHandler(w http.ResponseWriter, r *http.Request) {r.ParseForm()

    // 第一种方式
    username := r.Form["username"][0]
    password := r.Form["password"][0]

    // 第二种方式
    //username := r.Form.Get("username")
    //password := r.Form.Get("password")

    fmt.Printf("username=%s, password=%s", username, password)

}
func main() {http.HandleFunc("/post", PostHandler)
    log.Println("Running at port 8899 ...")

    err := http.ListenAndServe(":8899", nil)
    if err != nil {log.Fatal("ListenAndServe: ", err.Error())
    }

}
package main

import (
    "log"
    "net/http"
)

func PostHandler(w http.ResponseWriter, r *http.Request) {m := make(map[string]string)
    r.ParseForm()

    form := r.PostForm
    for k, v := range form {if len(v) < 1 {continue}
        m[k] = v[0]
    }

    log.Println(m)
}
func main() {http.HandleFunc("/post", PostHandler)
    log.Println("Running at port 8899 ...")

    err := http.ListenAndServe(":8899", nil)
    if err != nil {log.Fatal("ListenAndServe: ", err.Error())
    }

}

2. 接收 application/json 类型的请求

实际开发中,往往是一些数据对象,我们需要将这些数据对象以 JSON 的形式返回

接受到的请求的参数:

 {
    "status":"1",
    "msg":" 成功 ",
    "data":{
      "current":1,
     "size":20,
     "total":1,
        "userList":[
        {
            "telephone":"13800000000000",
            "userName":" 张三 ",
            "idCard":"443426189012211141",
            "vipRank":"",
            "roleName":"",
            "projectName":" 项目名 ",
            "accountStatus":"",
            "createTime":"2018-12-12 15:00"
        }
    ]
}
}

可以使用 [json-to-go] 在线工具,将 json 数据转换为 struct

package main

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

//AutoGenerated
type AutoGenerated struct {
    Status string `json:"status"`
    Msg    string `json:"msg"`
    Data   struct {
        Current  int `json:"current"`
        Size     int `json:"size"`
        Total    int `json:"total"`
        UserList []struct {
            Telephone     string `json:"telephone"`
            UserName      string `json:"userName"`
            IDCard        string `json:"idCard"`
            VipRank       string `json:"vipRank"`
            RoleName      string `json:"roleName"`
            ProjectName   string `json:"projectName"`
            AccountStatus string `json:"accountStatus"`
            CreateTime    string `json:"createTime"`
        } `json:"userList"`
    } `json:"data"`
}

func PostJsonHandler(w http.ResponseWriter, r *http.Request) {b, err := ioutil.ReadAll(r.Body)
    if err != nil {log.Println(err)
    }

    log.Printf("b = %s", b)

    var postJson AutoGenerated
    json.Unmarshal([]byte(b), &postJson)

    json, _ := json.Marshal(postJson)
    w.Write(json)

}
func main() {http.HandleFunc("/postJson", PostJsonHandler)
    log.Println("Running at port 8899 ...")

    err := http.ListenAndServe(":8899", nil)
    if err != nil {log.Fatal("ListenAndServe: ", err.Error())
    }

}

Postman 发起 application/json 请求

正文完
 0
评论(没有评论)