一、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)的更多相关文章

  1. 封装http请求键值对的js函数

    //封装http请求键值对的函数 function Map() { this.keys = new Array(); this.data = {}; //添加键值对 this.put = functi ...

  2. c# 键值数据保存XML文件

    /// <summary> /// 键值数据保存XML文件 /// </summary> /// <param name="fileName"> ...

  3. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...

  4. 将Windows上的文件上传到Linux上

    下载一个SSH Secure Shell Client即可. SSHSecureShellClient-3.2.9下载地址: 免费下载地址在 http://linux.linuxidc.com/ 用户 ...

  5. 关于 PHPMailer 邮件发送类的使用心得(含多文件上传)

    This is important for send mail PHPMailer 核心文件 class.phpmailer.php class.phpmaileroauth.php class.ph ...

  6. node07---post请求、表单提交、文件上传

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 【翻译】tus----一个可续传文件上传的开放协议

    tus tus是一个可续穿文件上传协议,它以Http协议为载体,统一了一个文件断点续传的标准. 这篇文章翻译自https://tus.io/ 目前该协议版本信息如下: Version: 1.0.0 ( ...

  8. HTTP上传 文件上传 图片上传 HTTP上传原理 文件上传原理 图片上传原理

    1.概述 在最初的http协议中,没有上传文件方面的功能.rfc1867(http://www.ietf.org/rfc/rfc1867.txt )为http协议添加了这个功能.浏览器按照此规范将用户 ...

  9. springMvc上传文件、读取zip/rar文件

    参考文章: http://www.cnblogs.com/interdrp/p/6734033.html 方法一: 1)没有配置org.springframework.web.multipart.co ...

  10. php 图片上传 文件上传 大小 限制

    nginx  413 Request Entity Too Large Php无法上传文件 查看php脚本运行用户,写个php脚本 <?php echo shell_exec("id ...

随机推荐

  1. 记一次针对excel导出的优化

    最近发现我们系统导出excel文件时由于是导出百万级数据导出,速度过慢并且内存占用多,故进行了下面的一次优化. 我们使用apache的poi进行excel文件操作 主要耗时: 1.从数据库得到需要导出 ...

  2. DC-5 靶机渗透测试

    DC-5 靶机渗透测试 冲冲冲,好好学习 .核心:footer 文件包含漏洞,wfuzz .收获总结写在文末. 谨记任务:找地方上传shell---> root. 操作机:kali 172.66 ...

  3. 洛谷P3052题解

    题面 看起来非常简单,但是细节多的一批的状压DP入门题. 我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间. 对于每一个 \(i\) , ...

  4. Windows API 进程相关笔记

    0. 前言 最近做了一个进程信息相关的项目,整理了一下自己做项目时的笔记,分享给大家 1. 相关概念 1.1 HANDLE 概念 HANDLE(句柄)是Windows操作系统中的一个概念. 在Wind ...

  5. 关于Tomcat服务器的笔记

    javaWEB的概念: a)什么是 JavaWeb:             JavaWeb 是指,所有通过 Java 语言编写可以通过浏览器访问的程序的总称,叫 JavaWeb. JavaWeb 是 ...

  6. Shell-12-linux信号

    信号类型 信号:信号是在软件层次上对中断机制的一种模拟,通过给一个进程发送信号,执行相应的处理函数 进程可以通过三种方式来响应一个信号: 1.忽略信号,即对信号不做任何处理,其中有两个信号不能忽略: ...

  7. QT从入门到入土(八)——项目打包和发布

    引言 新手上路可谓是困难重重,你永远不知道下一个困难会在什么时候出现,在完成了运动控制卡封装发布过程中可谓是举步维艰.因此记录一下qt5+vs2019的打包发布方法. 打包一般分为两步: 将编译后的e ...

  8. NOIP 模拟 $20\; \rm y$

    题解 \(by\;zj\varphi\) 首先发现一共最多只有 \(2^d\) 种道路,那么可以状压,(不要 \(dfs\),会搜索过多无用的状态) 那么设 \(f_{i,j,k}\) 为走 \(i\ ...

  9. SpringBoot获取请求的参数

    说明 SpringBoot 为我们封装了许多,简便的获取请求参数的方法! 1.获取无注解获取请求参数 请求地址:http://192.168.0.115:8080/myproject/test/noA ...

  10. Specification使用in

    //是否包含下级授权点 1 包含 2 不包含 List<AuthorizationPoint> authList = null; List<Long> pointIdList ...