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 请求
正文完