当前位置: 首页 > news >正文

【五、http】go的http的信息提交

一、post提交的几种

  • form表单
  • json
  • 文件

1、提交表单

//http的postfunc 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

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()
}

结果:

{"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、提交文件

package mainimport ("bytes""encoding/json""fmt""io""io/ioutil""mime/multipart""net/http""net/url""os""strings"
)func postForm() {// form data 形式 query string,类似于 name=poloxue&age=18data := 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

结果:

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-streamabc--a7c095e326382b46f363a6fa2d579ea3c02245a6a8368969a37ddfb50dd2
Content-Disposition: form-data; name="uploadfile2"; filename="uploadfile2"
Content-Type: application/octet-streamabc--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"
}
http://www.lryc.cn/news/217151.html

相关文章:

  • 第六讲:VBA与ACCESS的ADO连接中,所涉及的对象
  • 【计算机网络】同源策略及跨域问题
  • uniapp在APP端使用swiper进行页面不卡顿滑动
  • 遗憾
  • hustoj 平台
  • 如何使用Scrapy提取和处理数据
  • 拟合与过拟合
  • 科学化决策数据分析,先从量化开始
  • 使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
  • 阿里云盘第三方linux客户端“小白羊”云盘“Aria2本地连接已断开”错误的解决方法
  • Linux flock和fcntl函数详解
  • React 组件点击事件
  • Windows 下编译 TensorFlow 2.9.1 CC库
  • Databricks 入门之连接外部数据库
  • 家庭互动新维度:TikTok的亲子体验
  • redis教程 一 redis中的常用命令
  • 【第28例】IPD体系进阶 | 需求管理:需求实现过程
  • 聊聊我对AI Agents技术的一些看法
  • 32 mysql in 的实现
  • Qt QtCreator添加自定义注释
  • docker 各种命令
  • 【优选算法系列】【专题五位运算】第一节.常见的位运算(面试题 01.01. 判定字符是否唯一和268. 丢失的数字)
  • 学习笔记二十八:K8S控制器Daemonset入门到企业实战应用
  • 您对互联网有多“上瘾”?
  • 数据挖掘题目:设ε= 2倍的格网间距,MinPts = 6, 采用基于1-范数距离的DBSCAN算法对下图中的实心格网点进行聚类,并给出聚类结果(代码解答)
  • STM32HAL-完全解耦面向对象思维的架构-时间轮片法使用(timeslice)
  • C++ 程序员入门需要多久,怎样才能学好?
  • SpringBoot项目打war包部署到tomcat访问路径去掉项目名
  • 58同城面试
  • 【数据结构】归并排序 的递归实现与非递归实现