go 发送post请求(键值对、上传文件、上传zip)
一、post请求的Content-Type为键值对
1、PostForm方式
package main
import (
"net/http"
"net/url"
"fmt"
"io/ioutil"
"bytes"
"strings"
"mime/multipart"
"os"
"io"
"time"
)
func main() {
postForm1()
} //以PostForm的方式发送body为键值对的post请求
func postForm1() {
//这是一个Post 参数会被返回的地址 `这里写代码片`
uri:="http://127.0.0.1:8888/test"
data := urlValues()
resopne,err:= http.PostForm(uri,data)
if err !=nil {
fmt.Println("err=",err)
}
//http返回的response的body必须close,否则就会有内存泄露
defer func() {
resopne.Body.Close()
fmt.Println("finish")
}()
body,err:=ioutil.ReadAll(resopne.Body)
if err!=nil {
fmt.Println(" post err=",err)
}
fmt.Println(string(body))
}
//获取键值对的body
func urlValues() url.Values{
//方式1
data1 := url.Values{"name":{"TiMi"},"id":{"123"}}
fmt.Println(data1)
//方式2
data2 := url.Values{}
data2.Set("name", "TiMi")
data2.Set("id", "123")
fmt.Println(data2)
//方式3
data3 := make(url.Values)
data3["name"] = []string{"TiMi"}
data3["id"] = []string{"123"}
fmt.Println(data3)
/*
map[id:[123] name:[TiMi]]
map[id:[123] name:[TiMi]]
map[id:[123] name:[TiMi]]
*/
return data1
}
2、Do方式
package main
import (
"net/http"
"net/url"
"fmt"
"io/ioutil"
"bytes"
"strings"
"mime/multipart"
"os"
"io"
"time"
)
func main() {
postForm2()
}
//以Do的方式发送body为键值对的post请求
func postForm2() {
uri := "http://127.0.0.1:8888"
resource := "/test"
data := urlValues()
u, _ := url.ParseRequestURI(uri)
u.Path = resource
urlStr := u.String()
client := &http.Client{}
r, _ := http.NewRequest("POST", urlStr, strings.NewReader(data.Encode()))
r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
res, err := client.Do(r)
if err != nil {
fmt.Println(err.Error())
return
}
//http返回的response的body必须close,否则就会有内存泄露
defer func() {
res.Body.Close()
fmt.Println("finish")
}()
//读取body
body,err:=ioutil.ReadAll(res.Body)
if err!=nil {
fmt.Println(" post err=",err)
}
fmt.Println(string(body))
}
func urlValues() url.Values{
//方式1
data1 := url.Values{"name":{"TiMi"},"id":{"123"}}
fmt.Println(data1)
//方式2
data2 := url.Values{}
data2.Set("name", "TiMi")
data2.Set("id", "123")
fmt.Println(data2)
//方式3
data3 := make(url.Values)
data3["name"] = []string{"TiMi"}
data3["id"] = []string{"123"}
fmt.Println(data3)
/*
map[id:[123] name:[TiMi]]
map[id:[123] name:[TiMi]]
map[id:[123] name:[TiMi]]
*/
return data1
}
二、post请求发送文件
1、以二进制形式上传
package main
import (
"net/http"
"net/url"
"fmt"
"io/ioutil"
"bytes"
"strings"
"mime/multipart"
"os"
"io"
"time"
)
func main() {
postFile1()
}
//以二进制格式上传文件
func postFile1(){
//这是一个Post 参数会被返回的地址
uri:="http://127.0.0.1:8888/test"
byte,err:=ioutil.ReadFile("redis_file.zip")
res,err :=http.Post(uri,"multipart/form-data",bytes.NewReader(byte))
if err !=nil {
fmt.Println("err=",err)
}
//http返回的response的body必须close,否则就会有内存泄露
defer func() {
res.Body.Close()
fmt.Println("finish")
}()
//读取body
body,err:=ioutil.ReadAll(res.Body)
if err!=nil {
fmt.Println(" post err=",err)
}
fmt.Println(string(body))
}
2、以键值对形式上传
package main import (
"net/http"
"net/url"
"fmt"
"io/ioutil"
"bytes"
"strings"
"mime/multipart"
"os"
"io"
"time"
) func main() {
postFile2()
} //以键值对形式上传文件
func postFile2() {
uri := "http://127.0.0.1:8888/test"
paramName := "file"
filePath := "redis_file.zip"
//打开要上传的文件
file, err := os.Open(filePath)
if err != nil {
fmt.Println(" post err=",err)
}
defer file.Close()
body := &bytes.Buffer{}
//创建一个multipart类型的写文件
writer := multipart.NewWriter(body)
//使用给出的属性名paramName和文件名filePath创建一个新的form-data头
part, err := writer.CreateFormFile(paramName, filePath)
if err != nil {
fmt.Println(" post err=",err)
}
//将源复制到目标,将file写入到part 是按默认的缓冲区32k循环操作的,不会将内容一次性全写入内存中,这样就能解决大文件的问题
_, err = io.Copy(part, file)
err = writer.Close()
if err != nil {
fmt.Println(" post err=",err)
}
request, err := http.NewRequest("POST", uri, body)
request.Header.Add("S-COOKIE2", "a=2l=310260000000000&m=460&n=00")
//writer.FormDataContentType() : 返回w对应的HTTP multipart请求的Content-Type的值,多以multipart/form-data起始
request.Header.Set("Content-Type", writer.FormDataContentType())
//设置host,只能用request.Host = “”,不能用request.Header.Add(),也不能用request.Header.Set()来添加host
request.Host = "api.shouji.com"
t := http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConns = 100
t.MaxConnsPerHost = 100
t.MaxIdleConnsPerHost = 100
clt := http.Client{
Timeout: 10 * time.Second,
Transport: t,
}
defer clt.CloseIdleConnections()
res, err := clt.Do(request)
//http返回的response的body必须close,否则就会有内存泄露
defer func() {
res.Body.Close()
fmt.Println("finish")
}()
if err != nil {
fmt.Println("err is ", err)
}
body1, err1 := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println("ioutil.ReadAll err is ", err1)
return
}
fmt.Println(string(body1[:]))
}
go 发送post请求(键值对、上传文件、上传zip)的更多相关文章
- 封装http请求键值对的js函数
//封装http请求键值对的函数 function Map() { this.keys = new Array(); this.data = {}; //添加键值对 this.put = functi ...
- c# 键值数据保存XML文件
/// <summary> /// 键值数据保存XML文件 /// </summary> /// <param name="fileName"> ...
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...
- 将Windows上的文件上传到Linux上
下载一个SSH Secure Shell Client即可. SSHSecureShellClient-3.2.9下载地址: 免费下载地址在 http://linux.linuxidc.com/ 用户 ...
- 关于 PHPMailer 邮件发送类的使用心得(含多文件上传)
This is important for send mail PHPMailer 核心文件 class.phpmailer.php class.phpmaileroauth.php class.ph ...
- node07---post请求、表单提交、文件上传
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【翻译】tus----一个可续传文件上传的开放协议
tus tus是一个可续穿文件上传协议,它以Http协议为载体,统一了一个文件断点续传的标准. 这篇文章翻译自https://tus.io/ 目前该协议版本信息如下: Version: 1.0.0 ( ...
- HTTP上传 文件上传 图片上传 HTTP上传原理 文件上传原理 图片上传原理
1.概述 在最初的http协议中,没有上传文件方面的功能.rfc1867(http://www.ietf.org/rfc/rfc1867.txt )为http协议添加了这个功能.浏览器按照此规范将用户 ...
- springMvc上传文件、读取zip/rar文件
参考文章: http://www.cnblogs.com/interdrp/p/6734033.html 方法一: 1)没有配置org.springframework.web.multipart.co ...
- php 图片上传 文件上传 大小 限制
nginx 413 Request Entity Too Large Php无法上传文件 查看php脚本运行用户,写个php脚本 <?php echo shell_exec("id ...
随机推荐
- HttpRunner3源码阅读:4. loader项目路径加载,用例文件转换、方法字典生成
loader.py 这个文件中主要是对yaml,json用例加载转换成用例处理, 预置函数加载成方法字典,路径加载等 可用资料 [importlib]. https://docs.python.org ...
- JavaScript关于返回数据类型一个小小的笔记
Javascript关于返回数据类型的一个小笔记 javascript数据类型有两种. 一种是基本数据类型:String.Number.Boolean.Symbol.Underfine.Null 一种 ...
- HCIA-网络层IP地址
TCP/IP 每一层关联性 网络接口层-->TYPE 上层的网络层 --> Protocol -->不同的传输层协议 DSAP SSAP IP地址 剩下的8个字节 IPV4地址 4个 ...
- TCP可靠传输
1. TCP 可靠性如何保证? 信道可靠:用三次握手.四次挥手保证连接正确: 数据正确:分区编号.校验和.超时重传: 传输控制:流量控制.拥塞控制 2. 重传机制 TCP可靠传输方式是序列号与确认应答 ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- 精简ABP的模块依赖
ABP的模块非常方便我们扩展自己的或使用ABP提供的模块功能,对于ABP自身提供的模块间的依赖关系想一探究竟,并且试着把不必要的模块拆掉,找到那部分核心模块.本次使用的是AspNetBoilerpla ...
- HTTP缓存——协商缓存(缓存验证)
协商缓存 所谓"协商",可以理解为:客户端和服务端双方商量着来. 客户端检查资源超过有效期.强缓存命中失败的情况下,则发出请求"询问"服务器是否资源真的过期了, ...
- CVE-2021-1732 Windows 本地权限提升漏洞 EXP 下载
漏洞简介 2021年2月10日,微软修复了一个Windows本地权限提升漏洞,漏洞编号为 CVE-2021-1732 ,本地攻击者可以利用该漏洞将权限提升为 System ,目前EXP已公开. 影响范 ...
- NLP与深度学习(一)NLP任务流程
1. 自然语言处理简介 根据工业界的估计,仅有21% 的数据是以结构化的形式展现的[1].在日常生活中,大量的数据是以文本.语音的方式产生(例如短信.微博.录音.聊天记录等等),这种方式是高度无结构化 ...
- 踩坑记录之 -- String.IndexOf 在 .Net5 和 .Netcore3 中返回值不一样
.Net Core3.1 下 运行此段代码 class Program { static void Main(string[] args) { // .NET Core 3.1 string s = ...