httpc

package module
v0.0.0-...-adb2786 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 7, 2021 License: MIT Imports: 15 Imported by: 2

README

简介

链式调用 http 客户端
理论上只兼容最新稳点版 go 编译器,如果你在老版本上可用,那只是巧合,本库不做任何保证 本库保留随时修改的权力,不做任何稳定承诺

理念

单我们调用 http 请求时,最后一步操作就是发起请求(GET POST PUT PATCH DELETE 等)。 在发起请求之前可能会需要进行各种操作加工我们需要发起的请求,所以我我将 http 调用改成了链式调用。在发起之前,可选的执行各种操作。 每次 请求加工以 http 方法结束,如果你需要多次使用某一种方法,请接收链式调用某个步骤,然后再进行操作 具体请参考代理设置 和 基础 URL 设置

基本使用

发起请求
res, err := httpc.Get("https://example.com")
if err != nil{
    panic(err)
}
defer res.Body.Close()

fmt.Println(res.Text()) // 以 text 显示响应内容

除了 Get 还支持 Options Head Post Put Patch Delete。
如果你想自己构建请求方法,可以使用 Do 方法,注意改方法会越过大量的链式调用。
Call 方法于基础方法相同,只是请求方式是使用字符串进行指定的。

设置 Body
m := struct{
    Name string
}{
    Name:"niconiconi",
}

// 支持 struct map io.Reader []byte string slice
// 其中 struct map slice 会在 header 里自动添加 Content-Type 为 "application/json"
res,err := httpc.SetBody(m).Post("https://postman-echo.com/post")
if err != nil{
	panic(err)
}


fmt.Println(res.Text())
FormData

文件上传

file, err := os.Open("./foo.jpg")
if err != nil {
	panic(err)
}
defer file.Close()

var rows []httpc.FromDataRow
rows = append(rows, httpc.FromDataRow{
	Key:   "file", // 对端指定的键名
	Value: file.Name(),
	Data:  file, // 如果不是数据则为 nil
})

res, err := httpc.SetFromData(rows...).Post("https://example.com")
if err != nil {
	panic(err)
}
defer res.Body.Close()

io.Copy(ioutil.Discard, res.Body) // 读取响应内容
设置 Header
res,err := httpc.SetHeader("Token","123456789").Get("https://postman-echo.com/get")
// res,err := httpc.SetHeaders(map[string]string{"foo":"bar"}) // 使用 map 设置 headers
if err != nil{
	panic(err)
}
defer res.Body.Close()

fmt.Println(res.Text())

除了直接指定 Header 本库还封装了常用的 Herader SetUserAgent 和 SetContentType

设置代理

因为设置理念是 调用作用域只向右进行,所以设置代理后请需要接收后才可以多调用

//client := httpc.SetProxy("socks5://127.0.0.1:1080")
client := httpc.SetProxy("http://127.0.0.1:8118")

// httpc.SetProxy("http://127.0.0.1:8118").Get("https://example.com") // 本次生效代理

res,err := client.Get("https://example.com")
if err != nil{
	panic(err)
}
defer res.Body.Close()

fmt.Println(res.Text())
设置超时时间
res, err := httpc.SetTimeout(time.Second * 30).Get("https://postman-echo.com/get")
基础 URL 设置

再某些时候我们会对某个网址进行重复调用,可变部分仅后面的 URL 这时我们就可以使用 SetBaseURL 设置一个值,然后就只用填写,可变部分了。 我个人是使用在 对某个网址的 API 调用上。

client := httpc.SetBaseURL("https://postman-echo.com")

res,err := client.Get("/get")
if err != nil{
	panic(err)
}

// 某个访问不是相同网址时可以暂时移除设置的 URL (实用于封装过后)
exampleRes,err := client.DeleteBaseURL().Get("https://example.com")
if err != nil{
	panic(err)
}

fmt.Println(exampleRes.Text())

fmt.Println(res.Text())
postRes,posrErr := client.Post("/post")
if posrErr != nil{
	panic(err)
}

fmt.Println(postRes.Text())
设置 URL 查询参数
res,err := httpc.SetURLQuery("name","niconiconi","foobar").Get("https://postman-echo.com/get")
//res,err := httpc.SetURLQueryS("name=niconiconi&token=123456").Get("https://postman-echo.com/get")
if err != nil{
	panic(err)
}

fmt.Println(res.Text())

除了 SetURLQuery 还有 AddURLQuery,Set 如果存在相同的键信息会直接进行覆盖。添加如果存在相同的键会对值进行合并处理

读取响应

除了上面的 Text() 还用 ToJSON() 可以使用,在我们调用 API 时大部分响应是以 json 格式进行返回的我们可以将响应读取到 struct 和 map 如果 你需要注意传入的类型必须为指针。

res, err := httpc.Get("https://postman-echo.com/get") if err != nil { panic(err) }

m := map[string]interface{}{}

if err := res.ToJSON(&m); err != nil {
	panic(err)
}

fmt.Println(m)
复合使用

比如说将我们需要的操作串在一起

client := httpc.SetBaseURL("https://postman-echo.com")

m := struct{
	Age int `json:"age"`
}{
Age: 8,
}

res,err := client.SetHeader("token","123456789").SetURLQuery("name","niconiconi").SetBody(m).Post("/post")
if err != nil{
	panic(err)
}

fmt.Println(res.Text())

Documentation

Index

Constants

View Source
const (

	// HeaderContentType 内容类型
	HeaderContentType = "Content-Type"
	// HeaderContentDisposition 内容说明
	HeaderContentDisposition = "Content-Disposition"

	// MIMEApplicationJSON json 类型
	MIMEApplicationJSON = "application/json"
	// MIMETextHTML html 类型
	MIMETextHTML = "text/html"
	// MIMETextHTMLUTF8 html 类型附带 utf-8 声明
	MIMETextHTMLCharsetUTF8 = MIMETextHTML + "; " + charsetUTF8
	// MIMEApplicationXML xml 类型(普通用户不可读)
	MIMEApplicationXML = "application/xml"
	// MIMETextXML xml 类型 (普通用户可读)
	MIMETextXML = "text/xml"
	// MIMETextPlain 文本类型
	MIMETextPlain = "text/plain"
	// MIMEXWWWFormURLEncoded 简单表单
	MIMEXWWWFormURLEncoded = "x-www-form-urlencoded"
)

Variables

View Source
var DefaultClient = New()

DefaultClient 默认客户端

Functions

func NewRequestWithContext

func NewRequestWithContext(ctx context.Context, method string, url string, headers map[string]string, body io.Reader) (*http.Request, error)

NewRequestWithContext 新建请求

Types

type Client

type Client struct {
	BaseURL  string        // 基础 URL
	URLQuery stdURL.Values // URL 查询参数

	Headers map[string]string // 头部信息
	Body    io.Reader         // 内容
	Client  http.Client       // 客户端

	Error *LinkError // 错误
}

Client 客户端

func AddURLQuery

func AddURLQuery(key string, values ...string) *Client

AddURLQuery 添加 URL 查询参数

func AddURLQueryS

func AddURLQueryS(query string) *Client

AddURLQueryS 以 string 的方式添加查询参数

func New

func New() *Client

New 新建客户端

func SetBaseURL

func SetBaseURL(url string) *Client

SetBaseURL 设置基础 URL 后续访问将默认拼接本URL

func SetBody

func SetBody(in interface{}) *Client

SetBody 设置 body 内容

func SetContentType

func SetContentType(contentType string) *Client

SetContentType 设置内容类型

func SetFromData

func SetFromData(rows ...FromDataRow) *Client

SetFromData 设置表单数据

func SetHeader

func SetHeader(key, value string) *Client

SetHeader 设置 header

func SetHeaders

func SetHeaders(headers map[string]string) *Client

SetHeaders 设置 headers

func SetProxy

func SetProxy(proxy string) *Client

SetProxy 设置代理(支持 http 以及 socks5 代理)

func SetTimeout

func SetTimeout(duration time.Duration) *Client

SetTimeout 设置超时时间

func SetURLQuery

func SetURLQuery(key string, values ...string) *Client

SetURLQuery 设置 URL 查询参数

func SetURLQueryS

func SetURLQueryS(query string) *Client

SetURLQueryS 以 string 的方式设置查询参数

func SetUserAgent

func SetUserAgent(ua string) *Client

SetUserAgent 设置浏览器标识

func UseClient

func UseClient(httpClient http.Client) *Client

UseClient 使用指定客户端发送请求

func UseDNS

func UseDNS(dns ...string) *Client

UseDNS 使用指定 dns 解析域名

func (Client) AddURLQuery

func (c Client) AddURLQuery(key string, values ...string) *Client

AddURLQuery 添加 URL 查询参数

func (Client) AddURLQueryS

func (c Client) AddURLQueryS(query string) *Client

AddURLQueryS 以 string 方式添加 URL 查询参数 name=niconiconi

func (Client) CallWithContext

func (c Client) CallWithContext(ctx context.Context, method string, url string) (*Response, error)

CallWithContext 使用指定 http 方法访问 url

func (Client) Delete

func (c Client) Delete(url string) (*Response, error)

Delete 发送 DELETE 请求

func (Client) DeleteBaseURL

func (c Client) DeleteBaseURL() *Client

DeleteBaseURL 删除基础 URL (如果有设置的话)

func (Client) DeleteHeaders

func (c Client) DeleteHeaders(keys ...string) *Client

DeleteHeaders 删除指定 headers

func (Client) DeleteProxy

func (c Client) DeleteProxy() *Client

DeleteProxy 删除代理

func (Client) DeleteURLQuery

func (c Client) DeleteURLQuery() *Client

DeleteURLQuery 删除 URL 查询参数

func (Client) DeleteWithContext

func (c Client) DeleteWithContext(ctx context.Context, url string) (*Response, error)

DeleteWithContext 发送 DELETE 请求(可取消)

func (Client) Do

func (c Client) Do(req *http.Request) (*Response, error)

Do 发送自定义请求(无法共享链式调用的数据)

func (Client) Get

func (c Client) Get(url string) (*Response, error)

Get 发送 GET 请求

func (Client) GetWithContext

func (c Client) GetWithContext(ctx context.Context, url string) (*Response, error)

GetWithContext 发送 GET 请求(可取消)

func (Client) Head

func (c Client) Head(url string) (*Response, error)

Head 获取响应头

func (Client) HeadWithContext

func (c Client) HeadWithContext(ctx context.Context, url string) (*Response, error)

HeadWithContext 获取响应头(可取消)

func (Client) Options

func (c Client) Options(url string) (*Response, error)

Options 获取目的资源所支持的通信选项

func (Client) OptionsWithContext

func (c Client) OptionsWithContext(ctx context.Context, url string) (*Response, error)

OptionsWithContext 获取目的资源所支持的通信选项(可取消)

func (Client) Patch

func (c Client) Patch(url string) (*Response, error)

Patch 发送 PATCH 请求

func (Client) PatchWithContext

func (c Client) PatchWithContext(ctx context.Context, url string) (*Response, error)

PatchWithContext 发送 PATCH 请求(可取消)

func (Client) Post

func (c Client) Post(url string) (*Response, error)

Post 发送 POST 请求

func (Client) PostWithContext

func (c Client) PostWithContext(ctx context.Context, url string) (*Response, error)

PostWithContext 发送 POST 请求(可取消)

func (Client) Put

func (c Client) Put(url string) (*Response, error)

Put 发送 PUT 请求

func (Client) PutWithContext

func (c Client) PutWithContext(ctx context.Context, url string) (*Response, error)

CallWithContext 发送 PUT 请求(可取消)

func (Client) SetBaseURL

func (c Client) SetBaseURL(url string) *Client

SetBaseURL 设置基础 URL 后续访问将默认拼接本URL

func (Client) SetBody

func (c Client) SetBody(body interface{}) *Client

SetBody 设置内容

func (Client) SetContentType

func (c Client) SetContentType(contentType string) *Client

SetContentType 设置内容类型

func (Client) SetFromData

func (c Client) SetFromData(rows ...FromDataRow) *Client

SetFromData 设置表单数据

func (Client) SetHeader

func (c Client) SetHeader(key, value string) *Client

SetHeader 设置 header 字段

func (Client) SetHeaders

func (c Client) SetHeaders(headers map[string]string) *Client

SetHeaders 设置 headers

func (Client) SetProxy

func (c Client) SetProxy(proxy string) *Client

SetProxy 设置代理

func (Client) SetTimeout

func (c Client) SetTimeout(duration time.Duration) *Client

SetTimeout 设置超时时间

func (Client) SetURLQuery

func (c Client) SetURLQuery(key string, values ...string) *Client

SetURLQuery 设置 URL 查询参数

func (Client) SetURLQueryS

func (c Client) SetURLQueryS(query string) *Client

SetURLQueryS 以 string 的方式设置查询参数

func (Client) SetUserAgent

func (c Client) SetUserAgent(UA string) *Client

SetUserAgent 设置浏览器标识

func (Client) UseDNS

func (c Client) UseDNS(dns ...string) *Client

UseDNS 使用指定 dns 解析域名

type FromDataRow

type FromDataRow struct {
	Key   string    // 键
	Value string    // 值 (如果上传的是文件则这里是文件名)
	Data  io.Reader // 数据 (如果上传的是文件则这里是文件不然则为空)
}

FromDataRow formData 单条数据

type LinkError

type LinkError struct {
	Value error

	Next *LinkError
}

LinkError 错误链

func NewLinkError

func NewLinkError(err error) *LinkError

NewLinkError 新建错误链

func (*LinkError) Error

func (e *LinkError) Error() string

func (*LinkError) Push

func (e *LinkError) Push(err error) *LinkError

Push 在尾部添加数据

func (*LinkError) Shift

func (e *LinkError) Shift(err error) *LinkError

Shift 在头部添加数据

func (*LinkError) Unwrap

func (e *LinkError) Unwrap() error

type Response

type Response struct {
	*http.Response
}

Response 包装 http.Response

func CallWithContext

func CallWithContext(ctx context.Context, method string, url string) (*Response, error)

CallWithContext 使用指定 http 方法访问 url

func Delete

func Delete(url string) (*Response, error)

Delete 发送 DELETE 请求

func DeleteWithContext

func DeleteWithContext(ctx context.Context, url string) (*Response, error)

DeleteWithContext 发送 DELETE 请求(可取消)

func Do

func Do(req *http.Request) (*Response, error)

Do 发送自定义请求

func Get

func Get(url string) (*Response, error)

Get 发送 GET 请求

func GetWithContext

func GetWithContext(ctx context.Context, url string) (*Response, error)

GetWithContext 发送 GET 请求(可取消)

func Head(url string) (*Response, error)

Head 获取响应头

func HeadWithContext

func HeadWithContext(ctx context.Context, url string) (*Response, error)

HeadWithContext 获取响应头(可取消)

func Options

func Options(url string) (*Response, error)

Options 获取目的资源所支持的通信选项

func OptionsWithContext

func OptionsWithContext(ctx context.Context, url string) (*Response, error)

OptionsWithContext 获取目的资源所支持的通信选项(可取消)

func Patch

func Patch(url string) (*Response, error)

Patch 发送 PATCH 请求)

func PatchWithContext

func PatchWithContext(ctx context.Context, url string) (*Response, error)

PatchWithContext 发送 PATCH 请求(可取消)

func Post

func Post(url string) (*Response, error)

Post 发送 POST 请求

func PostWithContext

func PostWithContext(ctx context.Context, url string) (*Response, error)

PostWithContext 发送 POST 请求(可取消)

func Put

func Put(url string) (*Response, error)

Put 发送 PUT 请求

func PutWithContext

func PutWithContext(ctx context.Context, url string) (*Response, error)

PutWithContext 发送 PUT 请求(可取消)

func (*Response) Bytes

func (r *Response) Bytes(maxSize ...int) ([]byte, error)

Bytes 以 byetes 的方式显示响应

func (Response) IsSuccessful

func (r Response) IsSuccessful() bool

IsSuccessFul 响应成功

func (*Response) Text

func (r *Response) Text(maxSize ...int) string

Text 将响应以解析为字符串输出

func (*Response) ToJSON

func (r *Response) ToJSON(ptr interface{}, maxSize ...int) error

ToJSON 以 JSON 的方式解析响应 接受一个 *map 和 *struct

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL