迁移代码
This commit is contained in:
parent
634cd5385a
commit
d9051b45d0
92
define.go
Normal file
92
define.go
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
// Package httpclient 基础请求库
|
||||||
|
//
|
||||||
|
// Author: go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Description: 基础常量定义
|
||||||
|
//
|
||||||
|
// File: define.go
|
||||||
|
//
|
||||||
|
// Version: 1.0.0
|
||||||
|
//
|
||||||
|
// Date: 2022/05/01 19:56:48
|
||||||
|
package httpclient
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ddliu/go-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 *httpclient.Response `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,
|
||||||
|
}
|
||||||
|
}
|
2
go.sum
2
go.sum
@ -1,4 +1,2 @@
|
|||||||
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/ddliu/go-httpclient v0.7.1 h1:COWYBalfbaFNe6e0eQU38++vCD5kzLh1H1RFs3xcn9g=
|
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/ddliu/go-httpclient v0.7.1/go.mod h1:uwipe9x9SYGk4JhBemO7+dD87QbiY224y0DLB9OY0Ik=
|
||||||
|
242
request.go
Normal file
242
request.go
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
// 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 (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/ddliu/go-httpclient"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 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) *httpclient.HttpClient {
|
||||||
|
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 httpclient.NewHttpClient().WithHeaders(fullHeader).
|
||||||
|
WithOption(httpclient.OPT_CONNECTTIMEOUT_MS, apiConfig.Timeout.Connect).
|
||||||
|
WithOption(httpclient.OPT_TIMEOUT_MS, 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 *httpclient.HttpClient
|
||||||
|
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