前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【测试平台系列】第一章手撸压力机(三)自定义http请求

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

作者头像
被测试耽误的大厨
发布2023-11-18 17:05:54
1150
发布2023-11-18 17:05:54
举报
文章被收录于专栏:测试平台系列测试平台系列

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

代码语言:javascript
复制
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文件中新增如下结构体:

代码语言:javascript
复制
// 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,结果如下:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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)
}

运行,打印结果如下:

代码语言:javascript
复制
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请求的配置,其他高级选项,在下章节讲述。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈测试开发之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档