引言
主要记录使用Golang实现一个POST请求所用到的小知识点
1、项目结构
客户端向服务端注册用户信息,服务端返回注册信息中的用户名
PS E:\goland-workspace\GolangLearning\http> tree /f
卷 文件 的文件夹 PATH 列表
卷序列号为 0C66-1433
E:.
├─client
│ client.go
│
└─server
server.go
1.1 server端
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
// user结构体,用于保存request Body中json解码后的内容
type user struct {
Name string
}
func registe(w http.ResponseWriter, r *http.Request) {
user1 := &user{}
body, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(body, user1)
fmt.Fprintf(w, "The name you submit is %s", user1.Name)
}
func main() {
http.HandleFunc("/register", registe)
http.ListenAndServe(":8080", nil)
}
注:
func ReadAll(r io.Reader) ([]byte, error)
从r中读取所有数据,返回字节切片func Unmarshal(data []byte, v any) error
解析json编码的数据,保存到指针v
指向的值
1.2 Client端
package main
import (
"fmt"
"io/ioutil"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"name":"tian"}`)
// body := strings.NewReader("{\"name\":\"tian\"}")
req, _ := http.NewRequest("POST", "http://127.0.0.1:8080/register", body)
res, _ := http.DefaultClient.Do(req)
ret, _ := ioutil.ReadAll(res.Body)
fmt.Println(string(ret))
}
注:
-
strings 库里的
func NewReader(s string) *Reader
(NewReader returns a new Reader reading from s)类似于bytes库里func NewBufferString(s string) *Buffer
和func NewReader(b []byte) *Reader
这里{"name":"tian"}
就是一段json格式的字符串,用反引号``括起来。当然也可以写成很麻烦的一种形式(body := strings.NewReader("{\"name\":\"tian\"}")
) -
func NewRequest(method, url string, body io.Reader) (*Request, error)
method方法会进行校验,常用的有GET,POST,PUT,DELETE
等;
url就是请求路径;
body指http报文负荷就是要传输的内容,其实现了io.Reader
,常见的有类型有*bytes.Buffer, *bytes.Reader, or *strings.Reader
2、运行
首先运行服务端,然后客户端发起请求,可以得到如下结果