一、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. Elasticsearch(9300、9200)未授权访问

    下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.zip 检测 http://localhost ...

  2. Apache Flink jobmanager/logs路径遍历CVE-2020-17519

    影响版本 1.11.0 1.11.1 1.11.2 poc http://192.168.49.2:8081/jobmanager/logs/..%252f..%252f..%252f..%252f. ...

  3. 让自己写的电子笔记连文带图全平台兼容(MarkDown图片显示兼容)

    目录 一.工具使用 语言使用:MarkDown 简介 使用原因 使用方法 软件使用:Typora 简介 环境设置搭建 1)搭建图床 2)配置PicGo 3)配置typora 4)测试 图片上传测试 平 ...

  4. .NET Core/.NET5/.NET6 开源项目汇总12:WPF组件库2

    系列目录     [已更新最新开发文章,点击查看详细] WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Frame ...

  5. Python脚本文件中使用中文

    Python做图形用户界面(GUI)开发时经常要在界面上显示中文,需要做如下处理(详见[1]和[2]2.3节): 在py文件的首行写上:# -- coding:utf-8 -- 保存py文件时要存为u ...

  6. LiteFlow 2.6.0版本发行注记,项目逻辑解耦的利器

    前言 自从LiteFlow 2.5.X版本发布依赖,陆续经历了10个小版本的迭代.社区群也稳固增长,每天都有很多小伙伴在问我问题. 但是我发现最多人问我的还是:什么时候能支持界面编排? 从LiteFL ...

  7. 004 PCI Express体系结构(四)

    一.PCI总线的中断机制 PCI总线使用INTA#.INTB#.INTC#和INTD#信号向处理器发出中断请求.这些中断请求信号为低电平有效,并与处理器的中断控制器连接.在PCI体系结构中,这些中断信 ...

  8. IntelliJ IDEA lombok插件的安装配置和使用

    一.安装 1.首先我们需要安装IntelliJ IDEA中的lombok插件,打开IntelliJ IDEA后点击菜单栏中的File-->Settings,或者使用快捷键Ctrl+Alt+S进入 ...

  9. STP相关概念

    1)桥ID(Bridge ID)=Bridge Priority+MAC 2)  端口ID(Port ID)=Port Priority+Port No 3)桥根 4)非桥根 5)根端口 6)指定端口 ...

  10. 第11篇-认识Stub与StubQueue

    在 第10篇-初始化模板表 我们介绍过TemplateInterpreter::initialize()函数,在这个函数中会调用TemplateTable::initialize()函数初始化模板表, ...