【测试平台系列】第一章手撸压力机(三)自定义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请求的配置,其他高级选项,在下章节讲述。

相关文章
|
20天前
|
关系型数据库 MySQL 测试技术
【分享】AgileTC测试用例管理平台使用分享
AgileTC 是一个脑图样式测试用例管理平台,支持用例设计、执行与团队协作,帮助测试人员高效管理测试流程。
165 116
【分享】AgileTC测试用例管理平台使用分享
|
18天前
|
人工智能 数据可视化 测试技术
AI测试平台自动遍历:低代码也能玩转全链路测试
AI测试平台的自动遍历功能,通过低代码配置实现Web和App的自动化测试。用户只需提供入口链接或安装包及简单配置,即可自动完成页面结构识别、操作验证,并生成可视化报告,大幅提升测试效率,特别适用于高频迭代项目。
|
25天前
|
人工智能 测试技术 调度
写用例写到怀疑人生?AI 智能测试平台帮你一键生成!
霍格沃兹测试开发学社推出AI智能测试用例生成功能,结合需求文档一键生成高质量测试用例,大幅提升效率,减少重复劳动。支持自定义提示词、多文档分析与批量管理,助力测试人员高效完成测试设计,释放更多时间投入核心分析工作。平台已开放内测,欢迎体验!
|
27天前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
20天前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
3月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
742 23
|
8月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
5月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
690 24
|
5月前
|
SQL 测试技术
除了postman还有什么接口测试工具
最好还是使用国内的接口测试软件,其实国内替换postman的软件有很多,这里我推荐使用yunedit-post这款接口测试工具来代替postman,因为它除了接口测试功能外,在动态参数的支持、后置处理执行sql语句等支持方面做得比较好。而且还有接口分享功能,可以生成接口文档给团队在线浏览。
239 2
|
7月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
336 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡