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 ...
随机推荐
- Vue单点登录控件代码分享
这里提供一个Vue单点登录的demo给大家参考,希望对想了解的朋友有一些帮助. 具体的原理大家可以查看我的上篇文章 vue实现单点登录的N种方式 废话不多少直接上代码 这里分两套系统,一是登录系统的主 ...
- 【抬杠.NET】如何进行IL代码的开发
背景 在有些时候,由于C#的限制,或是追求更高的性能,我们可以编写IL代码来达到我们的目的.本文将介绍几种IL代码开发的几种方式,环境为visual studio 2019 + net5.0 sdk. ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- IllegalArgumentException occurred while calling setter for property
参考https://blog.csdn.net/qq_41192690/article/details/80659427 主码 是 integer类型的 就不要在写成这个样子了 把type=" ...
- SpringBoot开发二十-私信列表
私信列表功能开发. 发送私信功能开发 首先创建一个实体类:Message package com.nowcoder.community.entity; import java.util.Date; p ...
- 温故知新,微软官方推荐的Visual Studio源代码管理之Git Ignore清单,开启新项目必备宝书
什么是Git Ignore清单 https://git-scm.com/docs/gitignore 简单来说,在Git进行源代码管理中,我们可以通过建立.gitignore来实现一个忽略的黑名单管理 ...
- Are You OK?主键、聚集索引、辅助索引
每张表都一定存在主键吗? 关于这个问题,各位小伙伴们不妨先自己想一想,再往下寻找答案. 首先公布结论:对于 InnoDB 存储引擎来说,每张表都一定有个主键(Primary Key)! 让人非常遗憾的 ...
- SQL 练习22
查询出只选修两门课程的学生学号和姓名 --方式1: SELECT Student.SId,Sname from Student WHERE SId in ( SELECT sid from sc GR ...
- Dockerfile 多阶段构建实践
写在前面 在Docker Engine 17.05 中引入了多阶段构建,以此降低构建复杂度,同时使缩小镜像尺寸更为简单.这篇小作文我们来学习一下如何编写实现多阶段构建的Dockerfile 关于doc ...
- redis的五大数据类型实现原理
1.对象的类型与编码 Redis使用前面说的五大数据类型来表示键和值,每次在Redis数据库中创建一个键值对时,至少会创建两个对象,一个是键对象,一个是值对象,而Redis中的每个对象都是由 redi ...