狼窝 2020-02-16
服务端
在golang中,实现一个普通的http接口可以处理get请求和x-www-form-urlencoded类型的post请求,而如果想实现处理json数据的post请求,则需要用另外的方式实现,接收的参数要从request.Body中读取:
getpost.go
package main import ( "net/http" "encoding/json" "log" ) func main() { http.HandleFunc("/login1", login1) http.HandleFunc("/login2", login2) http.ListenAndServe("0.0.0.0:8080", nil) } type Resp struct { Code string `json:"code"` Msg string `json:"msg"` } type Auth struct { Username string `json:"username"` Pwd string `json:"password"` } //post接口接收json数据 func login1(writer http.ResponseWriter, request *http.Request) { var auth Auth if err := json.NewDecoder(request.Body).Decode(&auth); err != nil { request.Body.Close() log.Fatal(err) } var result Resp if auth.Username == "admin" && auth.Pwd == "123456" { result.Code = "200" result.Msg = "登录成功" } else { result.Code = "401" result.Msg = "账户名或密码错误" } if err := json.NewEncoder(writer).Encode(result); err != nil { log.Fatal(err) } } //接收x-www-form-urlencoded类型的post请求或者普通get请求 func login2(writer http.ResponseWriter, request *http.Request) { request.ParseForm() username, uError := request.Form["username"] pwd, pError := request.Form["password"] var result Resp if !uError || !pError { result.Code = "401" result.Msg = "登录失败" } else if username[0] == "admin" && pwd[0] == "123456" { result.Code = "200" result.Msg = "登录成功" } else { result.Code = "203" result.Msg = "账户名或密码错误" } if err := json.NewEncoder(writer).Encode(result); err != nil { log.Fatal(err) } }
客户端
golang的标准api中用于http客户端请求的主要有三个api : http.Get,http.Post,http.PostForm,其区别如下:
API | 特点 |
---|---|
http.Get | 发送get请求 |
http.Post | post请求提交指定类型的数据 |
http.PostForm | post请求提交application/x-www-form-urlencoded数据 |
在使用http客户端api的时候要注意一个问题:请求地址的url必须是带http://协议头的完整url,不然请求结果为空。
getpostclient.go
package main import ( "net/http" "fmt" "io/ioutil" "net/url" "encoding/json" "bytes" ) type auth struct { Username string `json:"username"` Pwd string `json:"password"` } func main() { get() postWithJson() postWithUrlencoded() } func get() { //get请求 //http.Get的参数必须是带http://协议头的完整url,不然请求结果为空 resp, _ := http.Get("http://localhost:8080/login2?username=admin&password=123456") defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) //fmt.Println(string(body)) fmt.Printf("Get request result: %s\n", string(body)) } func postWithJson() { //post请求提交json数据 auths := auth{"admin","123456"} ba, _ := json.Marshal(auths) resp, _ := http.Post("http://localhost:8080/login1","application/json", bytes.NewBuffer([]byte(ba))) body, _ := ioutil.ReadAll(resp.Body) fmt.Printf("Post request with json result: %s\n", string(body)) } func postWithUrlencoded() { //post请求提交application/x-www-form-urlencoded数据 form := make(url.Values) form.Set("username","admin") form.Add("password","123456") resp, _ := http.PostForm("http://localhost:8080/login2", form) body, _ := ioutil.ReadAll(resp.Body) fmt.Printf("Post request with application/x-www-form-urlencoded result: %s\n", string(body)) }
运行getpost.go后再运行getpostclient输出结果如下:
Get request result: {"code":"200","msg":"登录成功"} Post request with json result: {"code":"200","msg":"登录成功"} Post request with application/x-www-form-urlencoded result: {"code":"200","msg":"登录成功"} Process finished with exit code 0