【golang实战】使用golang发送以及接受数据

发送以及接收 application/x-www-form-urlencoded 数据

客户端发送数据,并设置 Content-Type 为 application/x-www-form-urlencoded

func test() {
    var data = make(url.Values)
    data.Set("test2", "test-v") // 组装数据

    c := &http.Client{}
    req, err := http.NewRequest("POST", reqUrl, strings.NewReader(data.Encode()))
    if err != nil {
        log.Fatalln(err)
    }
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    log.Println(req.URL.String())
    resp, err := c.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln(err)
    }
}

服务端接受数据,使用 r.ParseForm() 解析表单数据,并使用 r.Form 读取表单数据

r.ParseForm()
log.Println("r.Method: ", r.Method)
log.Println("r.form: ", r.Form)
log.Println("r.PostForm: ", r.PostForm)
log.Println("r.MultipartForm: ", r.MultipartForm)

输出为

2019/10/22 19:22:51 r.Method:  POST
2019/10/22 19:22:51 r.form:  map[debug:[1] test2:[test-v]]
2019/10/22 19:22:51 r.PostForm:  map[test2:[test-v]]
2019/10/22 19:22:51 r.MultipartForm:  

发送以及接收 multipart/form-data 数据

客户端发送表单数据、文件,并设置 Content-Type 为 multipart/form-data。使用 w.CreateFormFile 写入文件,w.WriteField 写入新字段值,使用时需注意,必须在发送请求前关闭写入,不然会读不出数据

func test() {
    var rb = &bytes.Buffer{} // 创建一个buffer
    w := multipart.NewWriter(rb)
    //fw, err := w.CreateFormField("data.go") // 这个函数会把文件名当做参数,文件内容当作参数值发送给服务端
    fw, err := w.CreateFormFile("file", "data.go") // 自定义文件名,发送文件流
    if err != nil {
        log.Fatalln(err)
    }
    fi, err := os.Open("data.go")
    if err != nil {
        log.Fatalln(err)
    }
    _, _ = io.Copy(fw, fi) // 把文件内容,复制到fw中

    _ = w.WriteField("test3", "test-v") // 上传其他字段
    w.Close() // 很重要,一定要关闭写入,不然服务端会报EOF错误,而且度不到数据
    c := &http.Client{}
    req, err := http.NewRequest("POST", reqUrl, rb)
    if err != nil {
        log.Fatalln(err)
    }
    req.Header.Set("Content-Type", w.FormDataContentType())
    resp, err := c.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln(err)
    }
}

服务端接受数据,使用 r.ParseMultipartForm(32 << 20) 解析表单数据,并使用 r.Form 读取表单数据。

r.ParseMultipartForm(32 << 20)
log.Println("r.Method: ", r.Method)
log.Println("r.form: ", r.Form)
log.Println("r.PostForm: ", r.PostForm)
log.Println("r.MultipartForm: ", r.MultipartForm)
log.Println(r.FormFile("file"))

输出为

2019/10/22 20:15:26 r.Method:  POST
2019/10/22 20:15:26 r.form:  map[debug:[1] test3:[test-v]]
2019/10/22 20:15:26 r.PostForm:  map[test3:[test-v]]
2019/10/22 20:15:26 r.MultipartForm:  &{map[test3:[test-v]] map[file:[0xc000126370]]}
2019/10/22 20:15:26 {0xc00012d170} &{data.go map[Content-Disposition:[form-data; name="file"; filename="data.go"] Content-Type:[application/octet-stream]] 711 [112 97 99 107 97 103 101 32 109 97 105 110 10 10 105 109 112 111 114 116 32 34 116 105 109 101 34 10 10 116 121 112 101 32 100 111 99 80 111 115 116 32 115 116 114 117 99 116] } 

发送以及接收 application/json 数据

客户端发送json数据,并设置 Content-Type 为 application/json。使用 bytes.NewReader 将json字符串转成 byte 流传输

func test() {
    var js = `{"a":"a-v","b":"b-v"}`

    c := &http.Client{}
    req, err := http.NewRequest("POST", reqUrl, bytes.NewReader([]byte(js)))
    if err != nil {
        log.Fatalln(err)
    }
    req.Header.Set("Content-Type", "application/json;charset=utf-8")
    resp, err := c.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln(err)
    }
}

服务端接受数据,使用 ioutil.ReadAll 解析 request body 数据,并将其读出。

r.ParseForm() // 无效方法
json,_ := ioutil.ReadAll(r.Body) // 读取body数据
log.Println("r.Method: ", r.Method)
log.Println("r.form: ", r.Form)
log.Println("r.PostForm: ", r.PostForm)
fmt.Println("get json: ", string(json))

输出为

2019/10/22 20:56:00 r.Method:  POST
2019/10/22 20:56:00 r.form:  map[debug:[1]]
2019/10/22 20:56:00 r.PostForm:  map[]
2019/10/22 20:56:00 get json:  {"a":"a-v","b":"b-v"}

你可能感兴趣的:(golang)