【五、http】go的http的信息提交(表单,json,上传文件)

一、post提交的几种

  • form表单
  • json
  • 文件

1、提交表单

cpp 复制代码
//http的post

func requstPost(){
	params := make(url.Values)
	params.Set("name", "kaiyue")
	params.Set("age", "18")

	formDataStr := []byte(params.Encode())
	formDataByte := bytes.NewBuffer(formDataStr)

	requst, err := http.NewRequest(http.MethodPost, "http://httpbin.org/post", formDataByte)
	if err != nil {
		fmt.Println("ss")
	}
	requst.URL.RawQuery = params.Encode()

	r, err := http.DefaultClient.Do(requst)
	if err != nil {
		fmt.Println("ss")
	}
	defer r.Body.Close()
	printBody(r)
}

2、提交json

cpp 复制代码
func postJson(){
	u := struct {
		Name string `json:"name"`
		Age int `json:"age"`
	}{
		Name: "kaiyue",
		Age: 18,
	}
	payload, _ := json.Marshal(u)
	r, _ := http.Post(
		"http://httpbin.org/post",
		"application/x-www-form-urlencoded",
		bytes.NewReader(payload),
	)
	defer r.Body.Close()

	content, _ := io.ReadAll(r.Body)
	fmt.Printf("%s\n", content)
}

func main() {
	postJson()
}

结果:

cpp 复制代码
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{\"name\":\"kaiyue\",\"age\":18}": ""
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Content-Length": "26", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1", 
    "X-Amzn-Trace-Id": "Root=1-6544fb3a-777a0c6563dee4ad74037aeb"
  }, 
  "json": null, 
  "origin": "120.244.60.192", 
  "url": "http://httpbin.org/post"
}

3、提交文件

cpp 复制代码
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"mime/multipart"
	"net/http"
	"net/url"
	"os"
	"strings"
)

func postForm() {
	// form data 形式 query string,类似于 name=poloxue&age=18
	data := make(url.Values)
	data.Add("name", "poloxue")
	data.Add("age", "18")
	payload := data.Encode()

	r, _ := http.Post(
		"http://httpbin.org/post",
		"application/x-www-form-urlencoded",
		strings.NewReader(payload),
	)
	defer func() { _ = r.Body.Close() }()

	content, _ := ioutil.ReadAll(r.Body)
	fmt.Printf("%s", content)
}

func postJson() {
	u := struct {
		Name string `json:"name"`
		Age  int    `json:"age"`
	}{
		Name: "poloxue",
		Age:  18,
	}
	payload, _ := json.Marshal(u)
	r, _ := http.Post(
		"http://httpbin.org/post",
		"application/json",
		bytes.NewReader(payload),
	)
	defer func() { _ = r.Body.Close() }()

	content, _ := ioutil.ReadAll(r.Body)
	fmt.Printf("%s", content)
}

func postFile() {
	body := &bytes.Buffer{}

	writer := multipart.NewWriter(body)
	_ = writer.WriteField("words", "123")

	// 一个是输入表单的 name,一个上传的文件名称
	upload1Writer, _ := writer.CreateFormFile("uploadfile1", "uploadfile1")

	uploadFile1, _ := os.Open("uploadfile1")
	defer func() {_ = uploadFile1.Close()}()

	_, _ = io.Copy(upload1Writer, uploadFile1)

	// 一个是输入表单的 name,一个上传的文件名称
	upload2Writer, _ := writer.CreateFormFile("uploadfile2", "uploadfile2")

	uploadFile2, _ := os.Open("uploadfile2")
	defer func() {_ = uploadFile2.Close()}()

	_, _ = io.Copy(upload2Writer, uploadFile2)

	_ = writer.Close()

	fmt.Println(writer.FormDataContentType())
	fmt.Println(body.String())
	r, _ := http.Post("http://httpbin.org/post",
		writer.FormDataContentType(),
		body,
	)
	defer func() {_ = r.Body.Close()}()

	content, _ := ioutil.ReadAll(r.Body)

	fmt.Printf("%s", content)
}

func main() {
	// post 请求的本质,它是 request body 提交,相对于 get 请求(urlencoded 提交查询参数, 提交内容有大小限制,好像 2kb)
	// post 不同的形式也就是 body 的格式不同
	// post form 表单,body 就是 urlencoded 的形式,比如 name=poloxue&age=18
	// post json,提交的 json 格式
	// post 文件,其实也是组织 body 数据
	// postJson()
	postFile()
}

其中

uploadfile1 中的内容为 abc

uploadfile2 中的内容为 abc

结果:

cpp 复制代码
multipart/form-data; boundary=a7c095e326382b46f363a6fa2d579ea3c02245a6a8368969a37ddfb50dd2
--a7c095e326382b46f363a6fa2d579ea3c02245a6a8368969a37ddfb50dd2
Content-Disposition: form-data; name="words"

123
--a7c095e326382b46f363a6fa2d579ea3c02245a6a8368969a37ddfb50dd2
Content-Disposition: form-data; name="uploadfile1"; filename="uploadfile1"
Content-Type: application/octet-stream

abc

--a7c095e326382b46f363a6fa2d579ea3c02245a6a8368969a37ddfb50dd2
Content-Disposition: form-data; name="uploadfile2"; filename="uploadfile2"
Content-Type: application/octet-stream

abc

--a7c095e326382b46f363a6fa2d579ea3c02245a6a8368969a37ddfb50dd2--

{
  "args": {}, 
  "data": "", 
  "files": {
    "uploadfile1": "abc\n", 
    "uploadfile2": "abc\n"
  }, 
  "form": {
    "words": "123"
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Content-Length": "559", 
    "Content-Type": "multipart/form-data; boundary=a7c095e326382b46f363a6fa2d579ea3c02245a6a8368969a37ddfb50dd2", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1", 
    "X-Amzn-Trace-Id": "Root=1-6544fc1a-3104d8a606a4510d6a68fcde"
  }, 
  "json": null, 
  "origin": "120.244.60.192", 
  "url": "http://httpbin.org/post"
}
相关推荐
小吴同学(wlx)40 分钟前
Golang 进阶3—— 协程&管道
golang
技术卷41 分钟前
GO网络编程(三):海量用户通信系统1:登录功能初步
golang·网络编程
程序员-珍2 小时前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos
虽千万人 吾往矣4 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
魏大橙4 小时前
linux RCE本地/公网测试
网络·网络协议·udp
l1x1n04 小时前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
鄃鳕5 小时前
HTTP【网络】
网络·网络协议·http
读心悦7 小时前
如何在 Axios 中封装事件中心EventEmitter
javascript·http
CXDNW7 小时前
【网络篇】计算机网络——应用层详述(笔记)
服务器·笔记·计算机网络·http·web·cdn·dns
秋夫人9 小时前
http cache-control
网络·网络协议·http