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

news/2024/7/24 5:44:44 标签: http, golang, 网络协议
http://www.w3.org/2000/svg" style="display: none;">

一、post提交的几种

  • form表单
  • json
  • 文件

1、提交表单

//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

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 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

结果:

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"
}


http://www.niftyadmin.cn/n/5148729.html

相关文章

安装Visio后Office三件套打开后出错【亲测可用】

当安装好visio后,可能打开word, PPT, excel后出现格式错误甚至无法打开,或者卡退等离谱错误。此时,无需卸载重装,只需要使用电脑Office的自动修复功能即可,会自动帮助你重装三件套【加上visio是四件套了】 1. 打开设置…

ArGIS Engine专题(16)之GP工具实现影像批量复制重采样和按矢量范围批量裁剪

一、结果预览 (1)影像批量复制和重采样 (2)按矢量范围批量裁剪 二、需求简介 本文的最终目的其实是要实现影像按矢量范围批量裁剪,笔者准备处理的影像范围较大,并且是按各个市分块的,要实现统一裁剪时,需要将各个…

物理内存的组织形式

由于物理地址是连续的,页也是连续的,每个页大小也是一样的。因而对于任何一个地址,只要直接除一下每页的大小,很容易直接算出在哪一页。每个页有一个结构 struct page 表示,这个结构也是放在一个数组里面,这…

ES6~ES13新特性(二)

文章目录 一、ES71.Array Includes2.指数exponentiation运算符 二、ES81.Object values2.Object entries3.String Padding4.Trailing Commas5.Object Descriptors 三、ES9四、ES101.flat flatMap2.Object fromEntries3.trimStart、trimEnd4.其他知识点 五、ES111.BigInt2.Nulli…

适合女生的副业有哪些?整理了六个靠谱副业,女生必看

在这个互联网时代下,女生对于经济独立变得越来越看重。她们与男生一样,对于工作认真努力、追求进步,并且对于副业有着强烈的渴望和热爱。事实上,她们在副业领域的表现要远远超过很多男生,这一点不可否认。 女生在副业方…

RT-DETR 项目【训练】【验证】【推理】脚本

文章目录 训练 --train.py推理 --detect.py验证 --val.py不训练,只查看模型结构/参数量 --test.py有同学问 RT-DETR 怎么训练,其实和 YOLOv8 几乎一样,但是有很多同学没接触过 v8 我这里直接给大家写好几个脚本,大家直接在我的脚本上调节参数就可以训练了, 脚本包含【训…

低保真原型图:如何在设计初期就把握产品方向

在设计和开发数字产品时,原型图是一个至关重要的工具。原型图是产品设计的蓝图,它帮助设计师和开发者在产品开发过程中更好地理解和沟通他们的想法。在原型图领域,有一个广泛使用的概念,那就是“低保真原型图”。本文将探讨什么是…

forward和完美转发

std::move(value)是独立于值的右值引用&#xff0c;一个右值引用参数作为函数的形参&#xff0c;在函数内部再转发该参数的时候已经变成了一个左值&#xff0c;并不是它原来的类型了。 template<typename T> void forwardValue(T& val) {processValue(value); //…