简单的HTTP和REST客户端库(受Ruby Rest-Lient的启发)
功能部分详细描述了有关Resty功能的详细描述

string , []byte , struct , map , slice和io.ReaderContent-Typeio.Reader的缓冲区更少处理*http.Request实例可以在中间软件中访问,并通过Request.RawRequest请求执行Request.RawRequest.GetBody()多次读取。[]byte数组 - response.Body()或访问为string response.String()response.Time() response.ReceivedAt()JSON和XML内容类型的自动元帅和UnmarshalJSON ,如果您在没有标头Content-Type提供struct/mapapplication/problem+json & application/problem+xmlmultipart/form-data上传一个或多个文件Request.SetContext支持BasicAuth和Bearer令牌的授权选项ContentLength值curl -o标志。请参阅setOutputDirectory&setOutput。Timeout , RedirectPolicy , Proxy , TLSClientConfig , Transport等。Content-Type标头丢失时指定预期Content-Type选项。请参阅#92resty.New()创建多个客户端http.RoundTripper实施,请参阅SetTransportAttempt Request RequestAttemptHTTP/2和HTTP/1.1一起使用,也可以与Resty一起使用HTTP/3 ,请参阅此评论建议使用go1.20及以上。
最初,自v1.10.0版本以来,Resty开始支持go modules 。
启动Resty V2及更高版本,它完全包含GO模块包装。它需要一个能够理解/vN后缀导入的GO版本:
Resty作家还发布了《 Go Community》的项目。
struct方法。 # Go Modules
require github.com/go-resty/resty/v2 v2.16.2以下样品将帮助您使用Resty Library变得尽可能舒适。
// Import resty into your code and refer it as `resty`.
import "github.com/go-resty/resty/v2" // Create a Resty Client
client := resty . New ()
resp , err := client . R ().
EnableTrace ().
Get ( "https://httpbin.org/get" )
// Explore response object
fmt . Println ( "Response Info:" )
fmt . Println ( " Error :" , err )
fmt . Println ( " Status Code:" , resp . StatusCode ())
fmt . Println ( " Status :" , resp . Status ())
fmt . Println ( " Proto :" , resp . Proto ())
fmt . Println ( " Time :" , resp . Time ())
fmt . Println ( " Received At:" , resp . ReceivedAt ())
fmt . Println ( " Body : n " , resp )
fmt . Println ()
// Explore trace info
fmt . Println ( "Request Trace Info:" )
ti := resp . Request . TraceInfo ()
fmt . Println ( " DNSLookup :" , ti . DNSLookup )
fmt . Println ( " ConnTime :" , ti . ConnTime )
fmt . Println ( " TCPConnTime :" , ti . TCPConnTime )
fmt . Println ( " TLSHandshake :" , ti . TLSHandshake )
fmt . Println ( " ServerTime :" , ti . ServerTime )
fmt . Println ( " ResponseTime :" , ti . ResponseTime )
fmt . Println ( " TotalTime :" , ti . TotalTime )
fmt . Println ( " IsConnReused :" , ti . IsConnReused )
fmt . Println ( " IsConnWasIdle :" , ti . IsConnWasIdle )
fmt . Println ( " ConnIdleTime :" , ti . ConnIdleTime )
fmt . Println ( " RequestAttempt:" , ti . RequestAttempt )
fmt . Println ( " RemoteAddr :" , ti . RemoteAddr . String ())
/* Output
Response Info:
Error : <nil>
Status Code: 200
Status : 200 OK
Proto : HTTP/2.0
Time : 457.034718ms
Received At: 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
Body :
{
"args": {},
"headers": {
"Accept-Encoding": "gzip",
"Host": "httpbin.org",
"User-Agent": "go-resty/2.4.0 (https://github.com/go-resty/resty)",
"X-Amzn-Trace-Id": "Root=1-5f5ff031-000ff6292204aa6898e4de49"
},
"origin": "0.0.0.0",
"url": "https://httpbin.org/get"
}
Request Trace Info:
DNSLookup : 4.074657ms
ConnTime : 381.709936ms
TCPConnTime : 77.428048ms
TLSHandshake : 299.623597ms
ServerTime : 75.414703ms
ResponseTime : 79.337µs
TotalTime : 457.034718ms
IsConnReused : false
IsConnWasIdle : false
ConnIdleTime : 0s
RequestAttempt: 1
RemoteAddr : 3.221.81.55:443
*/ // Create a Resty Client
client := resty . New ()
resp , err := client . R ().
SetQueryParams ( map [ string ] string {
"page_no" : "1" ,
"limit" : "20" ,
"sort" : "name" ,
"order" : "asc" ,
"random" : strconv . FormatInt ( time . Now (). Unix (), 10 ),
}).
SetHeader ( "Accept" , "application/json" ).
SetAuthToken ( "BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F" ).
Get ( "/search_result" )
// Sample of using Request.SetQueryString method
resp , err := client . R ().
SetQueryString ( "productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more" ).
SetHeader ( "Accept" , "application/json" ).
SetAuthToken ( "BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F" ).
Get ( "/show_product" )
// If necessary, you can force response content type to tell Resty to parse a JSON response into your struct
resp , err := client . R ().
SetResult ( result ).
ForceContentType ( "application/json" ).
Get ( "v2/alpine/manifests/latest" ) // Create a Resty Client
client := resty . New ()
// POST JSON string
// No need to set content type, if you have client level setting
resp , err := client . R ().
SetHeader ( "Content-Type" , "application/json" ).
SetBody ( `{"username":"testuser", "password":"testpass"}` ).
SetResult ( & AuthSuccess {}). // or SetResult(AuthSuccess{}).
Post ( "https://myapp.com/login" )
// POST []byte array
// No need to set content type, if you have client level setting
resp , err := client . R ().
SetHeader ( "Content-Type" , "application/json" ).
SetBody ([] byte ( `{"username":"testuser", "password":"testpass"}` )).
SetResult ( & AuthSuccess {}). // or SetResult(AuthSuccess{}).
Post ( "https://myapp.com/login" )
// POST Struct, default is JSON content type. No need to set one
resp , err := client . R ().
SetBody ( User { Username : "testuser" , Password : "testpass" }).
SetResult ( & AuthSuccess {}). // or SetResult(AuthSuccess{}).
SetError ( & AuthError {}). // or SetError(AuthError{}).
Post ( "https://myapp.com/login" )
// POST Map, default is JSON content type. No need to set one
resp , err := client . R ().
SetBody ( map [ string ] interface {}{ "username" : "testuser" , "password" : "testpass" }).
SetResult ( & AuthSuccess {}). // or SetResult(AuthSuccess{}).
SetError ( & AuthError {}). // or SetError(AuthError{}).
Post ( "https://myapp.com/login" )
// POST of raw bytes for file upload. For example: upload file to Dropbox
fileBytes , _ := os . ReadFile ( "/Users/jeeva/mydocument.pdf" )
// See we are not setting content-type header, since go-resty automatically detects Content-Type for you
resp , err := client . R ().
SetBody ( fileBytes ).
SetContentLength ( true ). // Dropbox expects this value
SetAuthToken ( "<your-auth-token>" ).
SetError ( & DropboxError {}). // or SetError(DropboxError{}).
Post ( "https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf" ) // for upload Dropbox supports PUT too
// Note: resty detects Content-Type for request body/payload if content type header is not set.
// * For struct and map data type defaults to 'application/json'
// * Fallback is plain text content type 您可以使用各种PUT方法呼叫的组合,例如POST 。
// Note: This is one sample of PUT method usage, refer POST for more combination
// Create a Resty Client
client := resty . New ()
// Request goes as JSON content type
// No need to set auth token, error, if you have client level settings
resp , err := client . R ().
SetBody ( Article {
Title : "go-resty" ,
Content : "This is my article content, oh ya!" ,
Author : "Jeevanandam M" ,
Tags : [] string { "article" , "sample" , "resty" },
}).
SetAuthToken ( "C6A79608-782F-4ED0-A11D-BD82FAD829CD" ).
SetError ( & Error {}). // or SetError(Error{}).
Put ( "https://myapp.com/article/1234" )您可以使用各种PATCH方法呼叫的组合,例如POST 。
// Note: This is one sample of PUT method usage, refer POST for more combination
// Create a Resty Client
client := resty . New ()
// Request goes as JSON content type
// No need to set auth token, error, if you have client level settings
resp , err := client . R ().
SetBody ( Article {
Tags : [] string { "new tag1" , "new tag2" },
}).
SetAuthToken ( "C6A79608-782F-4ED0-A11D-BD82FAD829CD" ).
SetError ( & Error {}). // or SetError(Error{}).
Patch ( "https://myapp.com/articles/1234" ) // Create a Resty Client
client := resty . New ()
// DELETE a article
// No need to set auth token, error, if you have client level settings
resp , err := client . R ().
SetAuthToken ( "C6A79608-782F-4ED0-A11D-BD82FAD829CD" ).
SetError ( & Error {}). // or SetError(Error{}).
Delete ( "https://myapp.com/articles/1234" )
// DELETE a articles with payload/body as a JSON string
// No need to set auth token, error, if you have client level settings
resp , err := client . R ().
SetAuthToken ( "C6A79608-782F-4ED0-A11D-BD82FAD829CD" ).
SetError ( & Error {}). // or SetError(Error{}).
SetHeader ( "Content-Type" , "application/json" ).
SetBody ( `{article_ids: [1002, 1006, 1007, 87683, 45432] }` ).
Delete ( "https://myapp.com/articles" )
// HEAD of resource
// No need to set auth token, if you have client level settings
resp , err := client . R ().
SetAuthToken ( "C6A79608-782F-4ED0-A11D-BD82FAD829CD" ).
Head ( "https://myapp.com/videos/hi-res-video" )
// OPTIONS of resource
// No need to set auth token, if you have client level settings
resp , err := client . R ().
SetAuthToken ( "C6A79608-782F-4ED0-A11D-BD82FAD829CD" ).
Options ( "https://myapp.com/servers/nyc-dc-01" )用户可以将JSON/XML库的选择注册到Resty中或编写自己的选择。默认情况下,Resty寄存器分别登录标准encoding/json和encoding/xml 。
// Example of registering json-iterator
import jsoniter "github.com/json-iterator/go"
json := jsoniter . ConfigCompatibleWithStandardLibrary
client := resty . New ().
SetJSONMarshaler ( json . Marshal ).
SetJSONUnmarshaler ( json . Unmarshal )
// similarly user could do for XML too with -
client . SetXMLMarshaler ( xml . Marshal ).
SetXMLUnmarshaler ( xml . Unmarshal ) profileImgBytes , _ := os . ReadFile ( "/Users/jeeva/test-img.png" )
notesBytes , _ := os . ReadFile ( "/Users/jeeva/text-file.txt" )
// Create a Resty Client
client := resty . New ()
resp , err := client . R ().
SetFileReader ( "profile_img" , "test-img.png" , bytes . NewReader ( profileImgBytes )).
SetFileReader ( "notes" , "text-file.txt" , bytes . NewReader ( notesBytes )).
SetFormData ( map [ string ] string {
"first_name" : "Jeevanandam" ,
"last_name" : "M" ,
}).
Post ( "http://myapp.com/upload" ) // Create a Resty Client
client := resty . New ()
// Single file scenario
resp , err := client . R ().
SetFile ( "profile_img" , "/Users/jeeva/test-img.png" ).
Post ( "http://myapp.com/upload" )
// Multiple files scenario
resp , err := client . R ().
SetFiles ( map [ string ] string {
"profile_img" : "/Users/jeeva/test-img.png" ,
"notes" : "/Users/jeeva/text-file.txt" ,
}).
Post ( "http://myapp.com/upload" )
// Multipart of form fields and files
resp , err := client . R ().
SetFiles ( map [ string ] string {
"profile_img" : "/Users/jeeva/test-img.png" ,
"notes" : "/Users/jeeva/text-file.txt" ,
}).
SetFormData ( map [ string ] string {
"first_name" : "Jeevanandam" ,
"last_name" : "M" ,
"zip_code" : "00001" ,
"city" : "my city" ,
"access_token" : "C6A79608-782F-4ED0-A11D-BD82FAD829CD" ,
}).
Post ( "http://myapp.com/profile" ) // Create a Resty Client
client := resty . New ()
// just mentioning about POST as an example with simple flow
// User Login
resp , err := client . R ().
SetFormData ( map [ string ] string {
"username" : "jeeva" ,
"password" : "mypass" ,
}).
Post ( "http://myapp.com/login" )
// Followed by profile update
resp , err := client . R ().
SetFormData ( map [ string ] string {
"first_name" : "Jeevanandam" ,
"last_name" : "M" ,
"zip_code" : "00001" ,
"city" : "new city update" ,
}).
Post ( "http://myapp.com/profile" )
// Multi value form data
criteria := url. Values {
"search_criteria" : [] string { "book" , "glass" , "pencil" },
}
resp , err := client . R ().
SetFormDataFromValues ( criteria ).
Post ( "http://myapp.com/search" ) // Create a Resty Client
client := resty . New ()
// Setting output directory path, If directory not exists then resty creates one!
// This is optional one, if you're planning using absolute path in
// `Request.SetOutput` and can used together.
client . SetOutputDirectory ( "/Users/jeeva/Downloads" )
// HTTP response gets saved into file, similar to curl -o flag
_ , err := client . R ().
SetOutput ( "plugin/ReplyWithHeader-v5.1-beta.zip" ).
Get ( "http://bit.ly/1LouEKr" )
// OR using absolute path
// Note: output directory path is not used for absolute path
_ , err := client . R ().
SetOutput ( "/MyDownloads/plugin/ReplyWithHeader-v5.1-beta.zip" ).
Get ( "http://bit.ly/1LouEKr" )Resty提供易于使用的动态请求URL路径参数。可以在客户端和请求级别设置参数。客户层级别参数值可以在请求级别覆盖。
// Create a Resty Client
client := resty . New ()
client . R (). SetPathParams ( map [ string ] string {
"userId" : "[email protected]" ,
"subAccountId" : "100002" ,
}).
Get ( "/v1/users/{userId}/{subAccountId}/details" )
// Result:
// Composed URL - /v1/users/[email protected]/100002/details Resty提供了中间件能够操纵请求和响应的能力。它比回调方法更灵活。
// Create a Resty Client
client := resty . New ()
// Registering Request Middleware
client . OnBeforeRequest ( func ( c * resty. Client , req * resty. Request ) error {
// Now you have access to Client and current Request object
// manipulate it as per your need
return nil // if its success otherwise return error
})
// Registering Response Middleware
client . OnAfterResponse ( func ( c * resty. Client , resp * resty. Response ) error {
// Now you have access to Client and current Response object
// manipulate it as per your need
return nil // if its success otherwise return error
})Resty提供了可能被称为的OnError钩子,因为:
如果服务器有响应,则将原始错误包裹在*resty.ResponseError中,其中包含收到的最后一个响应。
// Create a Resty Client
client := resty . New ()
client . OnError ( func ( req * resty. Request , err error ) {
if v , ok := err .( * resty. ResponseError ); ok {
// v.Response contains the last response from the server
// v.Err contains the original error
}
// Log the error, increment a metric, etc...
})请参阅:curl_cmd_test.go
// Create a Resty Client
client := resty . New ()
resp , err := client . R ().
SetDebug ( true ).
EnableGenerateCurlOnDebug (). // CURL command generated when debug mode enabled with this option
SetBody ( map [ string ] string { "name" : "Alex" }).
Post ( "https://httpbin.org/post" )
curlCmdExecuted := resp . Request . GenerateCurlCommand ()
// Explore curl command
fmt . Println ( "Curl Command: n " , curlCmdExecuted + " n " )
/* Output
Curl Command:
curl -X POST -H 'Content-Type: application/json' -H 'User-Agent: go-resty/2.14.0 (https://github.com/go-resty/resty)' -d '{"name":"Alex"}' https://httpbin.org/post
*/ Resty提供了很少的准备使用重定向策略的准备工作,它还支持多个政策。
// Create a Resty Client
client := resty . New ()
// Assign Client Redirect Policy. Create one as per you need
client . SetRedirectPolicy ( resty . FlexibleRedirectPolicy ( 15 ))
// Wanna multiple policies such as redirect count, domain name check, etc
client . SetRedirectPolicy ( resty . FlexibleRedirectPolicy ( 20 ),
resty . DomainCheckRedirectPolicy ( "host1.com" , "host2.org" , "host3.net" ))实现RedirectPolicy接口,然后将其注册为Resty Client。请查看重定向,以获取更多信息。
// Create a Resty Client
client := resty . New ()
// Using raw func into resty.SetRedirectPolicy
client . SetRedirectPolicy ( resty . RedirectPolicyFunc ( func ( req * http. Request , via [] * http. Request ) error {
// Implement your logic here
// return nil for continue redirect otherwise return error to stop/prevent redirect
return nil
}))
//---------------------------------------------------
// Using struct create more flexible redirect policy
type CustomRedirectPolicy struct {
// variables goes here
}
func ( c * CustomRedirectPolicy ) Apply ( req * http. Request , via [] * http. Request ) error {
// Implement your logic here
// return nil for continue redirect otherwise return error to stop/prevent redirect
return nil
}
// Registering in resty
client . SetRedirectPolicy ( CustomRedirectPolicy { /* initialize variables */ }) // Create a Resty Client
client := resty . New ()
// Custom Root certificates, just supply .pem file.
// you can add one or more root certificates, its get appended
client . SetRootCertificate ( "/path/to/root/pemFile1.pem" )
client . SetRootCertificate ( "/path/to/root/pemFile2.pem" )
// ... and so on!
// Adding Client Certificates, you add one or more certificates
// Sample for creating certificate object
// Parsing public/private key pair from a pair of files. The files must contain PEM encoded data.
cert1 , err := tls . LoadX509KeyPair ( "certs/client.pem" , "certs/client.key" )
if err != nil {
log . Fatalf ( "ERROR client certificate: %s" , err )
}
// ...
// You add one or more certificates
client . SetCertificates ( cert1 , cert2 , cert3 ) // Custom Root certificates from string
// You can pass you certificates through env variables as strings
// you can add one or more root certificates, its get appended
client . SetRootCertificateFromString ( "-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----" )
client . SetRootCertificateFromString ( "-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----" )
// ... and so on!
// Adding Client Certificates, you add one or more certificates
// Sample for creating certificate object
// Parsing public/private key pair from a pair of files. The files must contain PEM encoded data.
cert1 , err := tls . X509KeyPair ([] byte ( "-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----" ), [] byte ( "-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----" ))
if err != nil {
log . Fatalf ( "ERROR client certificate: %s" , err )
}
// ...
// You add one or more certificates
client . SetCertificates ( cert1 , cert2 , cert3 )默认Go通过环境变量HTTP_PROXY支持代理。 Resty通过SetProxy & RemoveProxy提供支持。根据您的需要选择。
客户级代理设置应用于所有请求
// Create a Resty Client
client := resty . New ()
// Setting a Proxy URL and Port
client . SetProxy ( "http://proxyserver:8888" )
// Want to remove proxy setting
client . RemoveProxy ()Resty在每次尝试后使用退缩来增加重试间隔。
用法示例:
// Create a Resty Client
client := resty . New ()
// Retries are configured per client
client .
// Set retry count to non zero to enable retries
SetRetryCount ( 3 ).
// You can override initial retry wait time.
// Default is 100 milliseconds.
SetRetryWaitTime ( 5 * time . Second ).
// MaxWaitTime can be overridden as well.
// Default is 2 seconds.
SetRetryMaxWaitTime ( 20 * time . Second ).
// SetRetryAfter sets callback to calculate wait time between retries.
// Default (nil) implies exponential backoff with jitter
SetRetryAfter ( func ( client * resty. Client , resp * resty. Response ) (time. Duration , error ) {
return 0 , errors . New ( "quota exceeded" )
})默认情况下,Resty将重试在执行过程中返回非NIL错误的请求。因此,上述设置将导致重试的请求重试,而非NIL错误最多3次,每次尝试后延迟增加。
您可以选择为客户提供自定义重试条件:
// Create a Resty Client
client := resty . New ()
client . AddRetryCondition (
// RetryConditionFunc type is for retry condition function
// input: non-nil Response OR request execution error
func ( r * resty. Response , err error ) bool {
return r . StatusCode () == http . StatusTooManyRequests
},
)上面的示例将提出重试的请求,该请求以429 Too Many Requests状态代码。重要的是要注意,当您使用AddRetryCondition指定条件时,它将覆盖默认重试行为,该行为会根据请求期间遇到的错误进行检验。如果要在请求中遇到的错误中重试,类似于默认行为,您需要将其配置为以下内容:
// Create a Resty Client
client := resty . New ()
client . AddRetryCondition (
func ( r * resty. Response , err error ) bool {
// Including "err != nil" emulates the default retry behavior for errors encountered during the request.
return err != nil || r . StatusCode () == http . StatusTooManyRequests
},
)可以添加多个重试条件。请注意,如果指定了多个条件,则如果满足任何条件,将发生重试。
也可以使用resty.Backoff(...)来实现任意重试方案。参考。
// Create a Resty Client
client := resty . New ()
// Allow GET request with Payload. This is disabled by default.
client . SetAllowGetMethodPayload ( true ) // Here you go!
// Client 1
client1 := resty . New ()
client1 . R (). Get ( "http://httpbin.org" )
// ...
// Client 2
client2 := resty . New ()
client2 . R (). Head ( "http://httpbin.org" )
// ...
// Bend it as per your need!!! // Create a Resty Client
client := resty . New ()
// Unique settings at Client level
//--------------------------------
// Enable debug mode
client . SetDebug ( true )
// Assign Client TLSClientConfig
// One can set custom root-certificate. Refer: http://golang.org/pkg/crypto/tls/#example_Dial
client . SetTLSClientConfig ( & tls. Config { RootCAs : roots })
// or One can disable security check (https)
client . SetTLSClientConfig ( & tls. Config { InsecureSkipVerify : true })
// Set client timeout as per your need
client . SetTimeout ( 1 * time . Minute )
// You can override all below settings and options at request level if you want to
//--------------------------------------------------------------------------------
// Host URL for all request. So you can use relative URL in the request
client . SetBaseURL ( "http://httpbin.org" )
// Headers for all request
client . SetHeader ( "Accept" , "application/json" )
client . SetHeaders ( map [ string ] string {
"Content-Type" : "application/json" ,
"User-Agent" : "My custom User Agent String" ,
})
// Cookies for all request
client . SetCookie ( & http. Cookie {
Name : "go-resty" ,
Value : "This is cookie value" ,
Path : "/" ,
Domain : "sample.com" ,
MaxAge : 36000 ,
HttpOnly : true ,
Secure : false ,
})
client . SetCookies ( cookies )
// URL query parameters for all request
client . SetQueryParam ( "user_id" , "00001" )
client . SetQueryParams ( map [ string ] string { // sample of those who use this manner
"api_key" : "api-key-here" ,
"api_secret" : "api-secret" ,
})
client . R (). SetQueryString ( "productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more" )
// Form data for all request. Typically used with POST and PUT
client . SetFormData ( map [ string ] string {
"access_token" : "BC594900-518B-4F7E-AC75-BD37F019E08F" ,
})
// Basic Auth for all request
client . SetBasicAuth ( "myuser" , "mypass" )
// Bearer Auth Token for all request
client . SetAuthToken ( "BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F" )
// Enabling Content length value for all request
client . SetContentLength ( true )
// Registering global Error object structure for JSON/XML request
client . SetError ( & Error {}) // or resty.SetError(Error{}) unixSocket := "/var/run/my_socket.sock"
// Create a Go's http.Transport so we can set it in resty.
transport := http. Transport {
Dial : func ( _ , _ string ) (net. Conn , error ) {
return net . Dial ( "unix" , unixSocket )
},
}
// Create a Resty Client
client := resty . New ()
// Set the previous transport that we created, set the scheme of the communication to the
// socket and set the unixSocket as the HostURL.
client . SetTransport ( & transport ). SetScheme ( "http" ). SetBaseURL ( unixSocket )
// No need to write the host's URL on the request, just the path.
client . R (). Get ( "http://localhost/index.html" )可以通过Bazel建造,测试和依赖Resty。例如,运行所有测试:
bazel test :resty_test为了在测试应用程序时模拟HTTP请求,可以使用httpmock库。
使用默认的Resty客户端时,您应将客户端传递到库,如下:
// Create a Resty Client
client := resty . New ()
// Get the underlying HTTP Client and set it to Mock
httpmock . ActivateNonDefault ( client . GetClient ())可以在此处找到使用Ginko嘲笑Resty HTTP请求的更详细的示例。
Resty根据语义版本发布版本
gopkg.in服务进行库版本。v1.10.0发布以来,Resty完全适应了go mod功能。gopkg.in提供版本控制。 gopkg.in/resty.vX指向适当的标记版本; X表示版本系列编号,这是生产使用的稳定版本。对于gopkg.in/resty.v0 。我欢迎您的贡献!如果您发现要解决的任何改进或问题,请随时发送拉动请求,我喜欢包括修复/增强测试用例的拉动请求。我已经尽力带来了很好的代码覆盖范围。随意编写测试。
顺便说一句,我想知道您对Resty的看法。请打开问题或给我发送电子邮件;对我来说意义重大。
Jeevanandam M.([email protected])
在会员页面上查看。
查看贡献者页面。
Resty根据MIT许可发布,参考许可证文件。