【Golang 接口自动化02】使用标准库net/http发送Post请求
目录
写在前面
发送Post请求
示例代码
源码分析
Post请求参数解析
响应数据解析
验证
发送Json/XMl
Json请求示例代码
xml请求示例代码
总结
资料获取方法
写在前面
上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单独拎了出来,我们在这一篇一起从源码来了解一下Golang的Post请求。
发送Post请求
net/http发送Post请求很容易,下面的代码我们和Get请求一样,把响应的内容的信息打印出来了,细心的朋友可能会发现,在参数传递、和结果解析时用了三种不同的方式,我们将在后面进行解析。
示例代码
package mainimport ("bytes""fmt""io/ioutil""net/http""reflect""strings"
)func main() {resp, err := http.Post("http://httpbin.org/post","application/x-www-form-urlencoded",strings.NewReader("name=Detector&mobile=1xxxxxxxx"))if err != nil {fmt.Println(err)return}defer resp.Body.Close()headers := resp.Header// headers 打印报文头部信息for k, v := range headers {fmt.Printf("%v, %v\n", k, v) // %v 打印interfac{}的值}// 打印响应信息内容fmt.Printf("响应状态:%s,响应码: %d\n", resp.Status, resp.StatusCode)fmt.Printf("协议:%s\n", resp.Proto)fmt.Printf("响应内容长度: %d\n", resp.ContentLength)fmt.Printf("编码格式:%v\n", resp.TransferEncoding) // 未指定时为空fmt.Printf("是否压缩:%t\n", resp.Uncompressed)fmt.Println(reflect.TypeOf(resp.Body)) // *http.gzipReaderfmt.Println(resp.Body)buf := bytes.NewBuffer(make([]byte, 0, 512))length, _ := buf.ReadFrom(resp.Body)fmt.Println(len(buf.Bytes()))fmt.Println(length)fmt.Println(string(buf.Bytes()))body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)return}fmt.Println(string(body))
}
源码分析
Post请求参数解析
我们首先来看一下C:\Go\src\net\http\client.go中Post和Get请求的源码:
func Get(url string) (resp *Response, err error) {return DefaultClient.Get(url)
}
func Post(url string, contentType string, body io.Reader) (resp *Response, err error) {return DefaultClient.Post(url, contentType, body)
}
从上面的定义可以看出,Post请求的参数比Get复杂一些,不仅要传递string类型contentType还有传递io.Reader类型的body体。可能有的小伙伴就有疑问了-- io.Reader类型的body体是不是意味着我们一定要使用io.Reader模块来获取数据呢?
答案当然是否定的。
我们通过阅读源码,来找想要的答案。
找到其最小粒度的接口是一个比较好的手段,io.Reader最小粒度的接口的定义在C:\Go\src\io\io.go中:
type Reader interface {Read(p []byte) (n int, err error)
}
在我前面的一篇博客【Golang】基础10 Go语言最精妙的设计--interface中学习过 interface,其中有两句话是这样的:
interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。如果我们定义了一个interface的变量,那么这个变量里面可以存实现这个interface的任意类型的对象。
针对io.Reader的定义翻译一下就是,只要实现了Read(p []byte) (n int, err error)方法的类型,就可以存储io.Reader,从而作为Post请求的Body参数。
我们接着来看看响应resp中数据的定义。
响应数据解析
在上一篇我们对http请求中的数据进行了介绍,这一次我们针对resp.Body进行展开。
在C:\Go\src\net\http\response.go中我们可以看到它的类型Body io.ReadCloser,在C:\Go\src\io\io.go中我们可以看到对应的定义是这样的:
type ReadCloser interface {ReaderCloser
}
而Reader就是我们上面分析的过的请求body定义的Reader,而Closer是一个error类型:
type Closer interface {Close() error
}
根据我们上面的结论-- 定义的某个接口的变量可以存储同样实现该接口的任意类型对象,即是说任意类型,只要实现了 Reader和 Closer 即可以用来解析resp.Body。
那我们来验证一下示例里面使用的三种方法是不是符合我们这个结论。
验证
-
strings.NewReader
我们可以在C:\Go\src\strings\reader.go看到 Reader类型的Read方法:
-
bytes.NewBuffer
我们可以在C:\Go\src\bytes\buffer.go看到 Buffer类型的Read方法:
-
ioutil.ReadAll
我们可以在C:\Go\src\io\ioutil\ioutil.go看到 io.Reader类型的ReadAll和Close() error方法:

发送Json/XMl
在了解了上面的知识之后,我们再来看发送Json、XML数据等就比较简单了。
Json请求示例代码
func JsonReq() {info := make(map[string]interface{})info["name"] = "Detector"info["age"] = 15info["loc"] = "深圳"// 将map解析未[]byte类型bytesData, _ := json.Marshal(info)// 将解析之后的数据转为*Reader类型reader := bytes.NewReader(bytesData)println(reader)resp, _ := http.Post("http://httpbin.org/post","application/json",reader)body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}
代码里面给了一些注释,我们把要发送的数据转化为了 *Reader类型,然后就可以直接发送了。(我们从上面的源码分析可以知道这个类型是可以存储io.Reader的数据的)
xml请求示例代码
func XMLReq() {xml := `<?xml version="1.0" encoding="UTF-8"?><resources><string name="VideoLoading">Loading video…</string><string name="ApplicationName">what</string></resources>`bytesData := strings.NewReader(xml)resp, _ := http.Post("http://httpbin.org/post","application/xml",bytesData)body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}
总结
- Json、xml请求
- 请求、响应数据简析
- interface概念复习
资料获取方法
【留言777】


各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!
三连之后我会在评论区挨个私信发给你们~
相关文章:
【Golang 接口自动化02】使用标准库net/http发送Post请求
目录 写在前面 发送Post请求 示例代码 源码分析 Post请求参数解析 响应数据解析 验证 发送Json/XMl Json请求示例代码 xml请求示例代码 总结 资料获取方法 写在前面 上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单…...
LaTex语法(常用数学符号的语法和注意事项)
说明:[]括号表示把语法括起来,并不表示LaTex语法。 1. 求和符号(Σ) 这个符号的基本语法为:[\sum_{}^{}]。 符号有两种模式:内联数学模式(inside math mode)和显示数学模式(displayed math mode)。 内联数学模式:排版时使用各…...
Yunfly 一款高效、性能优异的node.js企业级web框架
介绍 Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。 Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一…...
mac m1安装Centos9
先看结果(在mac M1 安装centos8 安装不成功的原因大部分是没有找到正确的系统) 由于Cnetos8 停服,现有mac m1 上能够按照的Centos8 并非由官方发布,因此寻找官方发布的能够在mac m1上安装的centos版本。 在YouTuBe上找到一个视频…...
深入理解mAP
0 介绍 mAP是目标检测任务最重要的评价指标。 mAP 是mean average precosion的缩写,mean 和 average都是平均的意思, 所以这个指标的计算涉及到2次平均。 mean是对所有类别的平均, 比如VOC 数据有20个类, 每个类别分别计算AP&…...
PostGis -基础、Springboot 整合、电子围栏处理
目的: 为什么要用PostgreSQL? 因为有时候我们需要存储 空间数据,如:存储一个 多边形 到数据。PostGis中 geometry、geography :基本空间数据类型,用于表达点线面等空间要素,具体类型涵盖了OGC的简单对象模…...
【Linux】多线程的补充
1 线程安全的单例模式 1.1 什么是单例模式 单例模式是一种 "经典的, 常用的, 常考的" 设计模式. 1.2 什么是设计模式 IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些…...
【MySQL】表的操作
今天我们来谈谈MySQL下对表的操作 目录 一、创建表 二、查看表 2.1 查看库中存有的表 2.2 查看表结构 2.3 查看表的创建语句 三、修改表 3.1 重命名表名 3.2 新增列 3.3 修改列的数据类型 3.4 删除列 3.5 重命名列 3.6 向表中插入数据 四、删除表 一、创建表 我…...
自动化测试 selenium(测试系列7)
目录 前言: 1.什么是自动化测试 2.Selenium是什么 3.Selenium原理 4.SeleniumJava环境搭建 5.Selenium常用的API使用 5.1定位元素findElement 5.1.1css选择器 5.1.2id选择器 5.1.3类选择器 5.1.4xpath选择器 5.2操作测试对象 5.2.1click点击对象 5.2.…...
小研究 - JVM 垃圾回收方式性能研究(二)
本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 3 几种垃圾回收器 3.1 串行回收器 3.2 并行回…...
【网络安全带你练爬虫-100练】第15练:模拟用户登录
目录 一、目标1:理清逻辑 二、目标2:将每一步用代码进行表示 三、网络安全O 一、目标1:理清逻辑 模拟登录的基本流程 1、进入入口程序 2、读取目标URL 3、请求加上线程 4、确定请求数据包 5、请求格式的确认 6、数据的处理与判断 二、目标…...
Ansible
Ansible 文章目录 Ansible一、概念1.简介2.特性 二、ansible模块1.命令行格式2.模块1.command 模块2.shell 模块3.cron 模块4.user 模块5.group 模块6.copy 模块7.file 模块8.hostname 模块9.ping 模块10.yum 模块11.service/systemd 模块12.script 模块13.mount 模块14.archiv…...
kafka:消费者从指定时间的偏移开始消费(二)
我的前一篇博客《kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)》为了忽略忽略掉上线之前的所有消息,从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。 但这个方案需要使用不常用的AdminClient类,而且如果该主题如果是第…...
Spring的加载配置文件、容器和获取bean的方式
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Spring配置文件和容器相关 一、加载properties文件1.1加载…...
(二)利用Streamlit创建第一个app——单页面、多页面
1 单页面app Step1:创建一个新的Python脚本。我们称之为uber_pickups.py。 Step2:在您喜爱的IDE或文本编辑器中打开uber_pickups.py,然后添加以下行: import streamlit as st import pandas as pd import numpy as npStep3&…...
一条sql查询语句在mysql中的执行过程是什么
mysql的连接器 我们想要在mysql中执行一条sql查询语句,首先需要连接到mysql服务,那么客户端首先要向mysql服务端发起连接请求,我们可以在客户端用mysql -h [ip] -P [port] -u 用户名 -p 密码 命令向服务端发起连接请求,这个连接请…...
网络互联究竟是需要什么协议相同,什么协议不同?
混淆概念的几个说法: 说法1: “以太网交换机不可以实现采用不同网络层协议的互联” 原因:以太网交换机是数据链路层的设备,不懂网络层的知识 说法2: “网桥可互联不同的物理层、不同的MAC子层以及不同速率的以太网”…...
ajax axios json
目录 一、ajax概述 1. 概念 2. 实现方式 (1)原生的JS实现方式(了解) (2) JQeury实现方式 二、axios 介绍 三、axios使用 1. axios 发送get/post请求 2. axios验证用户名称是否存在 四、json 1. …...
外观模式——提供统一入口
1、简介 1.1、概述 在软件开发中,有时候为了完成一项较为复杂的功能,一个类需要和多个其他业务类交互,而这些需要交互的业务类经常会作为一个完整的整体出现,由于涉及的类比较多,导致使用时代码较为复杂。此时&#…...
Vue中导入并读取Excel数据
在工作中遇到需要前端上传excel文件获取到相应数据处理之后传给后端并且展示上传文件的数据. 一、引入依赖 npm install -S file-saver xlsxnpm install -D script-loadernpm install xlsx二、在main.js中引入 import XLSX from xlsx三、创建vue文件 <div><el-uplo…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
