Compare commits
3 Commits
master
...
feature/go
Author | SHA1 | Date | |
---|---|---|---|
bb4033d2dc | |||
f438b1e0ea | |||
d9051b45d0 |
88
define.go
Normal file
88
define.go
Normal file
@ -0,0 +1,88 @@
|
||||
// Package httpclient 基础请求库
|
||||
//
|
||||
// Author: go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Description: 基础常量定义
|
||||
//
|
||||
// File: define.go
|
||||
//
|
||||
// Version: 1.0.0
|
||||
//
|
||||
// Date: 2022/05/01 19:56:48
|
||||
package httpclient
|
||||
|
||||
const (
|
||||
// ContentTypeFormData form-data 请求
|
||||
ContentTypeFormData = "form-data"
|
||||
// ContentTypeFormURLEncoded x-www-form-urlencoded 请求
|
||||
ContentTypeFormURLEncoded = "application/x-www-form-urlencoded"
|
||||
// ContentTypeJSON json的请求方式
|
||||
ContentTypeJSON = "application/json"
|
||||
// ContentTypeDefault 默认的请求方式
|
||||
ContentTypeDefault = ContentTypeJSON
|
||||
)
|
||||
|
||||
const (
|
||||
// BodyTypeJson json数据
|
||||
BodyTypeJson = "json"
|
||||
// BodyTypeXML xml数据
|
||||
BodyTypeXML = "xml"
|
||||
// BodyTypeYaml yaml数据
|
||||
BodyTypeYaml = "yaml"
|
||||
)
|
||||
|
||||
const (
|
||||
// DefaultConnectTimeout 默认连接超时时间, 毫秒
|
||||
DefaultConnectTimeout = 1000
|
||||
// DefaultReadTimeout 默认读取超时时间, 毫秒
|
||||
DefaultReadTimeout = 1000
|
||||
)
|
||||
|
||||
// ApiRequestConfig api请求的配置
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Date: 2022/05/01 20:14:18
|
||||
type ApiRequestConfig struct {
|
||||
Method string `json:"method"` // 请求方法
|
||||
Domain string `json:"domain"` // 请求域名
|
||||
URI string `json:"uri"` // 请求的路由
|
||||
ResponseCodeField string `json:"response_code_field"` // 业务状态码字段
|
||||
ResponseMessageField string `json:"response_message_field"` // 业务状态码描述的字段
|
||||
ResponseDataField string `json:"response_data_field"` // 业务数据的字段
|
||||
SuccessCodeList []string `json:"success_code_list"` // 代表请求成功的code列表
|
||||
SuccessHttpCodeList []string `json:"success_http_code_list"` // 代表成功的http code列表
|
||||
Parameter map[string]interface{} `json:"parameter"` // 传入的请求参数
|
||||
CommonHeader map[string]string `json:"common_header"` // 全部请求都要传的header
|
||||
Body []byte `json:"-"` // 请求体
|
||||
FullURL string `json:"full_url"` // 完整请求地址
|
||||
Timeout Timeout `json:"timeout"` // 超时配置
|
||||
ContentType string `json:"content_type"` // 请求方法
|
||||
}
|
||||
|
||||
// Timeout 超时配置
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 15:02 2022/5/2
|
||||
type Timeout struct {
|
||||
Connect int `json:"connect"` // 连接超时
|
||||
Read int `json:"read"` // 读取超时时间
|
||||
}
|
||||
|
||||
// ApiResponse 接口响应结果
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// Date: 2022/05/01 20:25:39
|
||||
type ApiResponse struct {
|
||||
RequestConfig *ApiRequestConfig `json:"request_config"` // 请求配置
|
||||
Response map[string]interface{} `json:"response"` // 响应体
|
||||
Exception *Exception `json:"exception"` // 异常信息
|
||||
StartRequestTime int64 `json:"start_request_time"` // 开始请求时间, 纳秒
|
||||
FinishRequestTime int64 `json:"finish_request_time"` // 完成请求时间,纳秒
|
||||
}
|
76
exception.go
Normal file
76
exception.go
Normal file
@ -0,0 +1,76 @@
|
||||
// Package httpclient ...
|
||||
//
|
||||
// Author: go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Description: 定义异常
|
||||
//
|
||||
// File: exception.go
|
||||
//
|
||||
// Version: 1.0.0
|
||||
//
|
||||
// Date: 2022/05/01 20:40:08
|
||||
package httpclient
|
||||
|
||||
import "strings"
|
||||
|
||||
// Exception 定义异常
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Description: 对于各种异常的描述
|
||||
//
|
||||
// Date: 2022/05/01 20:48:21
|
||||
type Exception struct {
|
||||
Code string `json:"code"` // 异常的标识码
|
||||
Message string `json:"message"` // 异常的描述
|
||||
}
|
||||
|
||||
const (
|
||||
// BindRouterParamNotFound 绑定到路由的参数不存在
|
||||
BindRouterParamNotFound = "404001"
|
||||
// ResponseCodeNotFound 响应结果获取不到状态码字段
|
||||
ResponseCodeNotFound = "404002"
|
||||
// ResponseMessageNotFound 响应结果获取不到状态码描述字段
|
||||
ResponseMessageNotFound = "404003"
|
||||
// ResponseDataNotFound 响应结果获取不到数据字段
|
||||
ResponseDataNotFound = "404004"
|
||||
// DomainInvalid 域名设置错误, 必须是 http:// 或者 https:// 开头
|
||||
DomainInvalid = "400001"
|
||||
// SendRequestError 请求发送出现异常
|
||||
SendRequestError = "400002"
|
||||
// RequestMethodNotSupport 请求方法不支持
|
||||
RequestMethodNotSupport = "405001"
|
||||
)
|
||||
|
||||
// exceptionTable ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Description: 异常信息表
|
||||
//
|
||||
// Date: 2022/05/01 21:02:55
|
||||
var exceptionTable = map[string]string{
|
||||
BindRouterParamNotFound: "绑定到路由的参数{{bind_router_param}}不存在, 请确认参数配置",
|
||||
ResponseCodeNotFound: "基于配置无法获取响应体状态码, 请检查 response_code_field 的配置, 当前配置 {response_code_field}",
|
||||
ResponseMessageNotFound: "基于配置无法获取响应体状态码, 请检查 response_code_message 的配置, 当前配置 {response_code_message}",
|
||||
ResponseDataNotFound: "基于配置无法获取响应体状态码, 请检查 {response_code_data} 的配置, 当前配置 {response_code_data}",
|
||||
DomainInvalid: "api域名配置非法, 必须以 http:// 或者 https:// 开头, 当前配置 {domain}",
|
||||
RequestMethodNotSupport: "当前请求方法 {method} 不支持, 请核对相关配置",
|
||||
SendRequestError: "请求发送出现异常, 异常原因 : {real_reason}",
|
||||
}
|
||||
|
||||
// NewException 实力化异常
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:02:07
|
||||
func NewException(code string, exceptionData map[string]string) *Exception {
|
||||
mes := exceptionTable[code]
|
||||
for k, v := range exceptionData {
|
||||
mes = strings.ReplaceAll(mes, "{"+k+"}", v)
|
||||
}
|
||||
return &Exception{
|
||||
Code: code,
|
||||
Message: mes,
|
||||
}
|
||||
}
|
29
go.mod
29
go.mod
@ -2,4 +2,31 @@ module git.zhangdeman.cn/zhangdeman/httpclient
|
||||
|
||||
go 1.20
|
||||
|
||||
require github.com/ddliu/go-httpclient v0.7.1
|
||||
require (
|
||||
github.com/ddliu/go-httpclient v0.7.1
|
||||
github.com/guonaihong/gout v0.3.8
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/andybalholm/brotli v1.0.4 // indirect
|
||||
github.com/bytedance/sonic v1.7.0 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
|
||||
github.com/go-playground/locales v0.13.0 // indirect
|
||||
github.com/go-playground/universal-translator v0.17.0 // indirect
|
||||
github.com/go-playground/validator/v10 v10.4.1 // indirect
|
||||
github.com/goccy/go-json v0.10.0 // indirect
|
||||
github.com/json-iterator/go v1.1.9 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
|
||||
github.com/leodido/go-urn v1.2.0 // indirect
|
||||
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
|
||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa // indirect
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
|
||||
google.golang.org/protobuf v1.26.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.2.8 // indirect
|
||||
)
|
||||
|
91
go.sum
91
go.sum
@ -1,4 +1,91 @@
|
||||
github.com/ddliu/go-httpclient v0.6.9 h1:/3hsBVpcgCJwqm1dkVlnAJ9NWuYInbRc+i9FyUXX/LE=
|
||||
github.com/ddliu/go-httpclient v0.6.9/go.mod h1:zM9P0OxV4OGGz1pt/ibuj0ooX2SWH9a6MvXZLbT0JMc=
|
||||
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
|
||||
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
|
||||
github.com/bytedance/sonic v1.7.0 h1:P7DyGrkLbVDzcuqagPsSFnAwwljjhmB3qVF5wzmHOxE=
|
||||
github.com/bytedance/sonic v1.7.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/ddliu/go-httpclient v0.7.1 h1:COWYBalfbaFNe6e0eQU38++vCD5kzLh1H1RFs3xcn9g=
|
||||
github.com/ddliu/go-httpclient v0.7.1/go.mod h1:uwipe9x9SYGk4JhBemO7+dD87QbiY224y0DLB9OY0Ik=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs=
|
||||
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
|
||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
|
||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
|
||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
||||
github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
|
||||
github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/guonaihong/gout v0.3.8 h1:t0yjR0DgwVX6L4Zf/gv7ZVUcVPMicEpnnWjk3XxFTKA=
|
||||
github.com/guonaihong/gout v0.3.8/go.mod h1:wDXeuyeZR6MtaHbytO9RLcKW4iCDrWD6/KF1QwDtbRc=
|
||||
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
|
||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
|
||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA=
|
||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
|
243
request.go
Normal file
243
request.go
Normal file
@ -0,0 +1,243 @@
|
||||
// Package httpclient ...
|
||||
//
|
||||
// Author: go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Description:
|
||||
//
|
||||
// File: request.go
|
||||
//
|
||||
// Version: 1.0.0
|
||||
//
|
||||
// Date: 2022/05/01 21:25:03
|
||||
package httpclient
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/guonaihong/gout/dataflow"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/guonaihong/gout"
|
||||
)
|
||||
|
||||
// Request 发送请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:26:02
|
||||
func Request(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = strings.ToUpper(apiConfig.Method)
|
||||
switch apiConfig.Method {
|
||||
case http.MethodGet:
|
||||
return GET(apiConfig, header, param)
|
||||
case http.MethodPost:
|
||||
return POST(apiConfig, header, param)
|
||||
case http.MethodPut:
|
||||
return PUT(apiConfig, header, param)
|
||||
case http.MethodDelete:
|
||||
return DELETE(apiConfig, header, param)
|
||||
case http.MethodConnect:
|
||||
return Connect(apiConfig, header, param)
|
||||
case http.MethodOptions:
|
||||
return OPTION(apiConfig, header, param)
|
||||
case http.MethodTrace:
|
||||
return Trace(apiConfig, header, param)
|
||||
case http.MethodPatch:
|
||||
return Patch(apiConfig, header, param)
|
||||
default:
|
||||
return &ApiResponse{
|
||||
RequestConfig: apiConfig,
|
||||
Exception: NewException(RequestMethodNotSupport, map[string]string{"method": apiConfig.Method}),
|
||||
Response: nil,
|
||||
StartRequestTime: time.Now().UnixNano(),
|
||||
FinishRequestTime: time.Now().UnixNano(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// GET ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date: 2022/05/01 21:29:09
|
||||
func GET(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodGet
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// POST post请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:31:36
|
||||
func POST(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodPost
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// PUT put请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:31:52
|
||||
func PUT(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodPut
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// DELETE delete请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:32:08
|
||||
func DELETE(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodDelete
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// OPTION option请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:32:18
|
||||
func OPTION(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodOptions
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// Patch patch请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:36:12
|
||||
func Patch(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodPatch
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// Trace trace请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:36:24
|
||||
func Trace(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodTrace
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// Connect connect请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/05/01 21:36:39
|
||||
func Connect(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) *ApiResponse {
|
||||
apiConfig.Method = http.MethodConnect
|
||||
buildRequestURLAndParam(apiConfig, header, param)
|
||||
return send(apiConfig, header)
|
||||
}
|
||||
|
||||
// getHttpClient 获取httpclient实例
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 22:27 2022/5/1
|
||||
func getHttpClient(apiConfig *ApiRequestConfig, header map[string]string) *dataflow.DataFlow {
|
||||
fullHeader := make(map[string]string)
|
||||
for name, val := range apiConfig.CommonHeader {
|
||||
fullHeader[name] = val
|
||||
}
|
||||
for name, val := range header {
|
||||
fullHeader[name] = val
|
||||
}
|
||||
if len(apiConfig.ContentType) == 0 {
|
||||
apiConfig.ContentType = ContentTypeDefault
|
||||
}
|
||||
fullHeader["content-type"] = apiConfig.ContentType
|
||||
return gout.New().SetMethod(apiConfig.Method).
|
||||
SetHeader(header).
|
||||
SetTimeout(time.Second * time.Duration(apiConfig.Timeout.Connect+apiConfig.Timeout.Read))
|
||||
}
|
||||
|
||||
// buildRequestURLAndParam 构建完整请求URL与请求参数
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 21:55 2022/5/1
|
||||
func buildRequestURLAndParam(apiConfig *ApiRequestConfig, header map[string]string, param map[string]interface{}) {
|
||||
apiConfig.Method = strings.ToUpper(apiConfig.Method)
|
||||
if apiConfig.Timeout.Connect == 0 {
|
||||
apiConfig.Timeout.Connect = DefaultConnectTimeout
|
||||
}
|
||||
if apiConfig.Timeout.Read == 0 {
|
||||
apiConfig.Timeout.Read = DefaultConnectTimeout
|
||||
}
|
||||
formatParam := make(map[string]interface{})
|
||||
for paramName, paramValue := range param {
|
||||
uriTemplate := "{" + paramName + "}"
|
||||
if strings.Contains(apiConfig.URI, uriTemplate) {
|
||||
apiConfig.URI = strings.ReplaceAll(apiConfig.URI, uriTemplate, fmt.Sprintf("%v", paramValue))
|
||||
continue
|
||||
}
|
||||
formatParam[paramName] = paramValue
|
||||
}
|
||||
apiConfig.Parameter = formatParam
|
||||
paramPair := make([]string, 0)
|
||||
switch apiConfig.Method {
|
||||
case http.MethodPost:
|
||||
apiConfig.Body, _ = json.Marshal(formatParam)
|
||||
default:
|
||||
for paramName, paramValue := range formatParam {
|
||||
paramPair = append(paramPair, fmt.Sprintf("%v=%v", paramName, paramValue))
|
||||
}
|
||||
if len(paramPair) > 0 {
|
||||
apiConfig.URI = apiConfig.URI + "?" + strings.Join(paramPair, "&")
|
||||
}
|
||||
}
|
||||
if strings.HasSuffix(apiConfig.Domain, "/") {
|
||||
apiConfig.Domain = strings.TrimRight(apiConfig.Domain, "/")
|
||||
}
|
||||
if !strings.HasPrefix(apiConfig.URI, "/") {
|
||||
apiConfig.URI = "/" + apiConfig.URI
|
||||
}
|
||||
apiConfig.FullURL = apiConfig.Domain + apiConfig.URI
|
||||
}
|
||||
|
||||
// send 发送请求
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 14:53 2022/5/2
|
||||
func send(apiConfig *ApiRequestConfig, header map[string]string) *ApiResponse {
|
||||
var (
|
||||
client *dataflow.DataFlow
|
||||
err error
|
||||
)
|
||||
|
||||
response := &ApiResponse{
|
||||
RequestConfig: apiConfig,
|
||||
Response: nil,
|
||||
Exception: nil,
|
||||
StartRequestTime: time.Now().UnixNano(),
|
||||
FinishRequestTime: 0,
|
||||
}
|
||||
|
||||
defer func() {
|
||||
response.FinishRequestTime = time.Now().UnixNano()
|
||||
}()
|
||||
|
||||
client = getHttpClient(apiConfig, header)
|
||||
|
||||
/*if response.Response, err = client.Do(apiConfig.Method, apiConfig.FullURL, nil, bytes.NewReader(apiConfig.Body)); nil != err {
|
||||
response.Exception = NewException(SendRequestError, map[string]string{"real_reason": err.Error()})
|
||||
}*/
|
||||
return response
|
||||
}
|
Loading…
Reference in New Issue
Block a user