【Golang 接口自动化02】使用标准库net/http发送Post请求

这篇具有很好参考价值的文章主要介绍了【Golang 接口自动化02】使用标准库net/http发送Post请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

写在前面

发送Post请求

示例代码

源码分析

Post请求参数解析

响应数据解析

验证

发送Json/XMl

Json请求示例代码

xml请求示例代码

总结

资料获取方法


写在前面

上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单独拎了出来,我们在这一篇一起从源码来了解一下Golang的Post请求。

发送Post请求

net/http发送Post请求很容易,下面的代码我们和Get请求一样,把响应的内容的信息打印出来了,细心的朋友可能会发现,在参数传递、和结果解析时用了三种不同的方式,我们将在后面进行解析。

示例代码
package main

import (
	"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.gzipReader
	fmt.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 {
	Reader
	Closer
}

而Reader就是我们上面分析的过的请求body定义的Reader,而Closer是一个error类型:

type Closer interface {
	Close() error
}

根据我们上面的结论-- 定义的某个接口的变量可以存储同样实现该接口的任意类型对象,即是说任意类型,只要实现了 Reader和 Closer 即可以用来解析resp.Body

那我们来验证一下示例里面使用的三种方法是不是符合我们这个结论。

验证
  • strings.NewReader
    我们可以在C:\Go\src\strings\reader.go看到 Reader类型的 Read方法:

    【Golang 接口自动化02】使用标准库net/http发送Post请求,接口自动化,软件测试,自动化测试,程序人生,软件测试,python,职场和发展,自动化,自动化测试,软件测试工程师

  • bytes.NewBuffer
    我们可以在C:\Go\src\bytes\buffer.go看到 Buffer类型的 Read方法:

    【Golang 接口自动化02】使用标准库net/http发送Post请求,接口自动化,软件测试,自动化测试,程序人生,软件测试,python,职场和发展,自动化,自动化测试,软件测试工程师

  • ioutil.ReadAll
    我们可以在C:\Go\src\io\ioutil\ioutil.go看到 io.Reader类型的 ReadAllClose() error方法:

【Golang 接口自动化02】使用标准库net/http发送Post请求,接口自动化,软件测试,自动化测试,程序人生,软件测试,python,职场和发展,自动化,自动化测试,软件测试工程师

发送Json/XMl

在了解了上面的知识之后,我们再来看发送Json、XML数据等就比较简单了。

Json请求示例代码
func JsonReq() {
	info := make(map[string]interface{})
	info["name"] = "Detector"
	info["age"] = 15
	info["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请求,接口自动化,软件测试,自动化测试,程序人生,软件测试,python,职场和发展,自动化,自动化测试,软件测试工程师

【Golang 接口自动化02】使用标准库net/http发送Post请求,接口自动化,软件测试,自动化测试,程序人生,软件测试,python,职场和发展,自动化,自动化测试,软件测试工程师

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~文章来源地址https://www.toymoban.com/news/detail-620710.html

到了这里,关于【Golang 接口自动化02】使用标准库net/http发送Post请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高效自动化测试框架-优秀实践02-接口

    编写接口的操作的时候只需要编写接口的url,请求方法,请求体的样例 其他的将接口封装成服务或者的操作,全部使用装饰器来封装,能做到高效的解耦 在表示层编写业务测试用例的时候,可以使用函数式的编程方式,非常易读,还非常易于copy,提升编写效率 业务测试用例编写

    2023年04月08日
    浏览(61)
  • 使用ApiPost进行接口自动化测试

    自动化测试模块是针对测试人员的复杂业务的测试服务。可以在测试用例中建立一个或多个“测试计划”,“测试计划”由接口和控制器组成。 1、创建步骤 1、在API设计或API调试内保存接口。 2、打开自动化测试-测试用例,新建一个测试计划。 3、在右侧的API添加器内添加接

    2024年02月05日
    浏览(47)
  • 使用Postman进行接口自动化测试

    我们先思考一下,如果需要达到自动化接口测试的效果,那么我们在基本的模拟请求上还需要做哪些呢? 以下我粗略概括为 3 个问题(欢迎更多补充与建议): 如何判断接口是否请求成功 如何进行接口批量、定期测试 如何处理依赖接口问题(比如商品下单的接口必须要求

    2024年01月18日
    浏览(58)
  • 使用phpunit进行接口自动化测试

    年初一个偶然的机会接触到了phpunit,一个用PHP编程语言开发的开源软件,也是一个单元测试框架,有效利用的话可以大大提高接口遍历的效率。废话不多说,直接干货。 1.安装 在php的目录下 1 2 pear channel-discover pear; pear install phpunit/PHPUnit 2.配置 首先新建一个lib文件夹存放的配

    2024年01月20日
    浏览(46)
  • 测试中使用Postman实现接口自动化

    1.创建一个工作区 2.按照自己的需求去命名创建 1按照步骤去创建环境及表格的【变量】:VARIABLE 和【当前值】:CURRENT VALUE TEST_3 就是刚刚创建的环境 host就不用多说了都明白 Globals 这个就是来改变我们在请求接口时候赋值 全局变量 通用的 用法就不细说了往下看!!! 在第一

    2024年02月11日
    浏览(58)
  • 接口自动化测试工具,Postman使用详解

    1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件,Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已经停止维护,官方也不推荐使用该版本。 2、官网下载地址:http://www.getpostman.com 3:官方文档:http://www.getpostman.com/docs 2、第二步:新建接口请

    2024年02月06日
    浏览(81)
  • Jmeter接口自动化测试 —— Jmeter变量的使用

    ​在使用jmeter进行接口测试时,我们难免会遇到需要从上下文中获取测试数据的情况,这个时候就需要引入变量了。 添加-配置元件-用户自定义的变量 添加-配置元件-CSV 数据文件设置 变量的调用方式:${变量名} 变量的作用范围:变量可以写入任何测试组件的任何字段中(除

    2024年02月05日
    浏览(60)
  • python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

    经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路。 我们在百度搜索 天气查询 ,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接口测试用例脚本。 针对某个功能做接口测试,首先我们需

    2024年02月04日
    浏览(55)
  • python接口自动化测试 requests库的基础使用

    目录 简单介绍 Get请求 Post请求 其他类型请求 自定义headers和cookies SSL 证书验证 响应内容 获取header 获取cookies requests库简单易用的HTTP库   格式:  requests.get(url)  注意: 若需要传请求参数,可直接在 url 最后的 ? 后面,也可以调用 get() 时多加一个参数 params ,传入请求

    2023年04月26日
    浏览(57)
  • Python接口自动化测试:Postman使用-用例执行

    一个完整的测试,是必须要有断言的,没有断言就相当于没有预期结果是不完整的,Postman给我们提供了方便的断言方式 可以通过JS脚本来编写Pre-request Script和Tests Script Pre-request Script :预置脚本,可以用来修改一些默认参数,在请求发送之前,有点类型unittest里面的setUp()方法

    2024年02月11日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包