Go处理请求参数

作者: 太阳上的雨天 分类: Go 发布时间: 2022-02-19 22:48

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请求

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注