【测试平台系列】第一章手撸压力机(三)自定义http请求

简介: 今天继续深入往下讲,上一篇咱们对http的客户端设置进行了结构化统一,现在咱们开始对http请求进行结构化统一,首先咱们梳理http请求包含的结构。

今天继续深入往下讲,上一篇咱们对http的客户端设置进行了结构化统一,现在咱们开始对http请求进行结构化统一,首先咱们梳理http请求包含的结构。


http需要:
1. 接口名称,比如:登录接口
2. 接口方法,比如:get、post
3. 请求url, 比如:http://www.baidu.com
4. 请求头,  比如:token:******, content-type: ****
5. 请求query,比如:get请求中http://****/index?detail=1&id=2&name=3
6. 请求cookie, 比如:cookie:******
7. 请求body, 也就是请求体
8. http客户端设置项

根据以上列出的结构,我们在model/http_model.go文件中新增如下结构体:

// HttpRequest http请求的结构
type HttpRequest struct {
  Name               string             // 接口名称
  Url                string             // 接口uri
  Method             string             // 接口方法,Get Post Update...
  Headers            []Header           // 接口请求头
  Querys             []Query            // get请求时的url
  Cookies            []Cookie           // cookie
  Body               string             // 请求体
  HttpClientSettings HttpClientSettings // http客户端配置
}

// Header header
type Header struct {
  Field     string // 字段名称
  Value     string // 字段值
  FieldType string // 字段类型
}

// Query query
type Query struct {
  Field     string
  Value     string
  FieldType string
}

// Cookie cookie
type Cookie struct {
  Field     string
  Value     string
  FieldType string
}

同时,我们讲http_client.go从server目录移动到新建的client目录下,并修改RequestHttp()方法,首先将入参由HttpClientSettings结构体变成HttpRequest结构体。并设置相应的接口方法、header、query、cookie以及url,代码如下:



func RequestHttp(httpModel model.HttpRequest) {

  // 使用fasthttp 协程池

  // 新建一个http请求
  req := fasthttp.AcquireRequest()
  defer fasthttp.ReleaseRequest(req)
  // 新建一个http响应接受服务端的返回
  resp := fasthttp.AcquireResponse()
  defer fasthttp.ReleaseResponse(resp)

  // 新建一个http的客户端, newHttpClient是一个方法,在下面
  client := newHttpClient(httpModel.HttpClientSettings)

  // 添加该请求的http方法:get、post、delete、update等等
  req.Header.SetMethod(httpModel.Method)

  // 设置header
  for _, header := range httpModel.Headers {
    if strings.EqualFold(header.Field, "host") {
      // 由于在header中设置host不生效,所以需要强制设置生效
      req.SetHost(header.Value)
      req.UseHostHeader = true
    } else {
      req.Header.Add(header.Field, header.Value)
    }

  }

  // 设置cookie
  for _, cookie := range httpModel.Cookies {
    req.Header.SetCookie(cookie.Field, cookie.Value)
  }

  // 如果query不为空则设置query
  urlQuery := req.URI().QueryArgs()
  for _, query := range httpModel.Querys {
    if !strings.Contains(httpModel.Url, query.Field) {
      queryBy := []byte(query.Value)
      urlQuery.AddBytesV(query.Field, queryBy)
      httpModel.Url += fmt.Sprintf("&%s=%s", query.Field, query.Value)
    }
  }

  req.SetBody([]byte(httpModel.Body))
  // 添加该请求的http的url
  req.SetRequestURI(httpModel.Url)

  // 记录开始时间
  startTime := time.Now()
  // 开始请求
  err := client.Do(req, resp)
  // 计算响应时间差值
  requestTime := time.Since(startTime)
  if err != nil {
    fmt.Sprintln("发送http请求错误:", err.Error())
  }
  // 以毫秒打印
  fmt.Println("请求响应时间为:", requestTime.Milliseconds())
  fmt.Println("header:   ", string(req.Header.Header()))
  fmt.Println("req:     ", string(req.Body()))
  fmt.Println("resp:    ", string(resp.Body()))

}

然后,修改main.go中的main方法:



package main

import (
  "kitchen-engine/client"
  "kitchen-engine/model"
)

func main() {

  // 一个类型中的字段,可以重置,也可以使用默认值,在go中,所有的类型的初始值,都是字段类型的0值,比如string的初始值是""空字符串,int类型的初始值是0等等
  httpClientSettings := model.HttpClientSettings{
    Name:                     "测试厨房",
    NoDefaultUserAgentHeader: true,
    MaxConnDuration:          1000,
  }

  headers := []model.Header{
    model.Header{
      Field: "name",
      Value: "你好",
    },
  }

  httpRequest := model.HttpRequest{
    Name:               "planet",
    Url:                "http://www.baidu.com",
    Method:             "GET",
    HttpClientSettings: httpClientSettings,
    Headers:            headers,
  }

  client.RequestHttp(httpRequest)
}

运行,打印结果如下:

GOROOT=D:\workTools\GO #gosetup
GOPATH=C:\Users\13383\go #gosetup
D:\workTools\GO\bin\go.exe build -o C:\Users\13383\AppData\Local\Temp\GoLand\___go_build_kitchen_engine.exe kitchen-engine #gosetup
C:\Users\13383\AppData\Local\Temp\GoLand\___go_build_kitchen_engine.exe
req:   GET / HTTP/1.1
User-Agent: 测试厨房
Host: www.baidu.com

ok,到此基本完成了http请求的配置,其他高级选项,在下章节讲述。

相关文章
|
16天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
67 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
15天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
55 15
|
19天前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
28 3
|
24天前
|
前端开发 UED 开发者
CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度
本文探讨了CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度;图标字体则以字体形式呈现图标,便于调整样式。文章分析了两者的优缺点及应用场景,并提供了应用技巧和注意事项,旨在帮助开发者提升页面性能,改善用户体验。
23 5
|
15天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
4天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
30 11
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
60 3
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
74 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
262 7
Jmeter实现WebSocket协议的接口测试方法
|
3月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
272 3
快速上手|HTTP 接口功能自动化测试

热门文章

最新文章

下一篇
DataWorks