remote

package module
v0.18.0 Latest Latest
Warning

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

Go to latest
Published: Dec 29, 2025 License: Apache-2.0 Imports: 11 Imported by: 21

README

REMOTE 🏝

GoDoc Version Build Status Go Report Card Codecov

Crazy Simple, Chainable HTTP Client for Go

Remote is a paper-thin wrapper for Go's HTTP library, that gives you sensible defaults, a pretty API with some modern conveniences, and full control of your HTTP requests. It's the fastest and easiest way to make an HTTP call using Go.

Inspired by Brandon Romano's Wrecker. Thanks Brandon!

How to Get data from an HTTP server
// Structure to read remote data into
users := []struct {
    ID string
    Name string
    Username string
    Email string
}{}

// Get data from a remote server
remote.Get("https://jsonplaceholder.typicode.com/users").
    Result(users, nil).
    Send()

How to Post/Put/Patch/Delete data to an HTTP server
// Data to send to the remote server
user := map[string]string{
    "id": "ABC123",
    "name": "Sarah Connor",
    "email": "sarah@sky.net",
}

// Structure to read response into
response := map[string]string{}

// Post data to the remote server (use your own URL)
remote.Post("https://example.com/post-service").
    JSON(user). // encode the user object into the request body as JSON
    Result(response, nil). // parse response (or error) into a data structure
    Send()
Handling HTTP Errors

Web services represent errors in a number of ways. Some simply return an HTTP error code, while others return complex data structures in the response body. REMOTE works with each style of error handling, so that your app always has the best information to work from.

// Structure to read successful response into.  This format is specific to the HTTP service.
success := struct{Name: string, Value: string, Comment: string}

// Structure to read failed response data into.  This format is specific to the HTTP service.
failure := struct(Code: int, Reason: string, StackTrace: string)

transaction := remote.Get("https://example.com/service-that-might-error").
    .Result(&success, &failure)

// Transaction returns an error **IF** the HTTP response code is not successful (200-299)
if err := transaction.Send(); err != nil {
    // Handle errors here.
    // `failure` variable will be populated with data from the remote service
    return
}

// Fall through to here means that the transaction was successful.  
// `success` variable will be populated with data from the remote service.

Middleware

Middleware allows you to modify a request before it is sent to the remote server, or modify the response after it is returned by the remote server. Each middleware object includes three hooks

Included Middleware
// AUTHORIZATION adds a simple "Authorization" header to your request
remote.Get("https://jsonplaceholder.typicode.com/users").
    Use(middleware.Authorization(myAuthorizationKey)).
    Result(users, nil).
    Send()
// BASIC AUTH adds a Base64 encoded "Authorization" header to your request,
// which follows the basic authorization standard
remote.Get("https://jsonplaceholder.typicode.com/users").
    Use(middleware.BasicAuth(username, password)).
    Result(users, nil).
    Send()
// DEBUG prints debugging statements to the console
remote.Get("https://jsonplaceholder.typicode.com/users").
    Use(middleware.Debug()).
    Result(users, nil).
    Send()
// OPAQUE makes direct changes to the URL string.
remote.Get("https://jsonplaceholder.typicode.com/users").
    Use(middleware.Opaque(opaqueURLStringHere)).
    Result(users, nil).
    Send()
Writing Custom Middleware

It's easy to write additional, custom middleware for your project. Just follow the samples in the /middleware folder, and pass in any object that follows the Middleware interface.

Config(*Transaction) allows you to change the transaction configuration before it is compiled into an HTTP request. This is typically the simplest, and easiest way to modify a request

Request(*http.Request) allows you to modify the raw HTTP request before it is sent to the remote server. This is useful in the rare cases when you need to make changes to a request that this library doesn't support.

Response(*http.Response) allows you to modify the raw HTTP response before its results are parsed and returned to the caller.

Turbine Queue

Remote works with the Turbine queue to queue and retry transactions.


myQueue := queue.New(WithConsumers(remote.Consumer()))

remote.Post("https://server.com").
    Queue(myQueue).
    Send()
Publish Transactions to a Queue

When you create a remote Transaction, you can add it to a Turbine queue using the .Queue method. This method allows you to include a list of Task Options that modify the task that is published to the queue. For instance, you can choose a specific task priority, delay time, or maximum retry count.

remote.Post("https://server.com").
    Queue(
        myQueue, 
        queue.WithPriority(0), // these options modify the created queue.Task
        queue.WithRetryCount(8)). // these options modify the created queue.Task
    Send()

IMPORTANT: When you queue a transaction it is executed asynchronously, and possibly several times until successful. This means that you cannot receive live responses in your application anymore. So, Result and Error modifiers will be ignored, as will the AfterRequest portions of any options.

Consume Transactions from a Queue

This library includes a turbine queue.Consumer that executes remote.Transactions from the queue. This consumer can take any number of remote.Options to configure how queued transactions will be executed.


// Create a queue.Consumer to handle remote transactions
consumer := remote.Consumer(
    remote.WithClient(...) // these options modify the created remote.Transaction
)

myQueue := queue.New(WithConsumers(consumer))

Pull Requests Welcome

Original versions of this library have been used in production on commercial applications for years, and have helped speed up development for everyone involved.

I'm now open sourcing this library, and others, with hopes that you'll also benefit from an easy HTTP library.

Please use GitHub to make suggestions, pull requests, and enhancements. We're all in this together! 🏝

Documentation

Overview

Package remote provides a simple and clean API for making HTTP requests to remote servers.

Package remote provides a simple and clean API for making HTTP requests to remote servers.

Index

Constants

View Source
const Accept = "Accept"

Accept is the string used in the HTTP header to request a response be encoded as a MIME type

View Source
const ContentType = "Content-Type"

ContentType is the string used in the HTTP header to designate a MIME type

View Source
const ContentTypeActivityPub = "application/activity+json"

ContentTypeActivityPub is the standard MIME type for ActivityPub content

View Source
const ContentTypeAtomXML = "application/atom+xml"

ContentTypeAtomXML is the standard MIME Type for an Atom RSS feed

View Source
const ContentTypeForm = "application/x-www-form-urlencoded"

ContentTypeForm is the standard MIME Type for Form encoded content

View Source
const ContentTypeHTML = "text/html"

ContentTypeHTML is the standard MIME type for HTML content

View Source
const ContentTypeJSON = "application/json"

ContentTypeJSON is the standard MIME Type for JSON content

View Source
const ContentTypeJSONFeed = "application/feed+json"

ContentTypeJSONFeed is the standard MIME Type for JSON Feed content https://en.wikipedia.org/wiki/JSON_Feed

View Source
const ContentTypeJSONLD = "application/ld+json"

ContentTypeJSONLD is the standard MIME Type for JSON-LD content https://en.wikipedia.org/wiki/JSON-LD

View Source
const ContentTypeJSONResourceDescriptor = "application/jrd+json"

ContentTypeJSONResourceDescriptor is the standard MIME Type for JSON Resource Descriptor content which is used by WebFinger: https://datatracker.ietf.org/doc/html/rfc7033#section-10.2

View Source
const ContentTypePlain = "text/plain"

ContentTypePlain is the default plaintext MIME type

View Source
const ContentTypeRSSXML = "application/rss+xml"

ContentTypeRSSXML is the standard MIME Type for a RSS feed

View Source
const ContentTypeXML = "application/xml"

ContentTypeXML is the standard MIME Type for XML content

View Source
const UserAgent = "User-Agent"

UserAgent is the string used in the HTTP header to identify the client making the request

Variables

This section is empty.

Functions

func DefaultClient added in v0.16.0

func DefaultClient() *http.Client

DefaultClient returns an HTTP client with a reasonable timeout.

Types

type Option added in v0.12.0

type Option struct {

	// BeforeRequest is called before an http.Request is generated. It can be used to
	// modify Transaction values before they are assembled into an http.Request object.
	BeforeRequest func(*Transaction) error

	// ModifyRequest is called after an http.Request has been generated, but before it is sent to the
	// remote server. It can be used to modify the request, or to replace it entirely.
	// If it returns a non-nil http.Response, then that is used INSTEAD OF calling the remote server.
	// If it returns a nil http.Response, then the request is sent to the remote server as normal.
	ModifyRequest func(*Transaction, *http.Request) *http.Response

	// AfterRequest is executed after an http.Response has been received from the remote server, but before it is
	// parsed and returned to the calling application.
	AfterRequest func(*Transaction, *http.Response) error
}

Option is a decorator that can modify the request before it is sent to the remote HTTP server, or modify the response after it is returned by the remote HTTP server.

type Transaction

type Transaction struct {
	// contains filtered or unexported fields
}

Transaction represents a single HTTP request/response to a remote HTTP server.

func Delete

func Delete(url string) *Transaction

Delete creates a new HTTP request to the designated URL, using the DELETE method.

func Get

func Get(url string) *Transaction

Get creates a new HTTP request to the designated URL, using the GET method

func New added in v0.16.0

func New() *Transaction

New returns a fully initialized Transaction object with default settings.

func Patch

func Patch(url string) *Transaction

Patch creates a new HTTP request to the designated URL, using the PATCH method

func Post

func Post(url string) *Transaction

Post creates a new HTTP request to the designated URL, using the POST method

func Put

func Put(url string) *Transaction

Put creates a new HTTP request to the designated URL, using the PUT method

func (*Transaction) Accept added in v0.10.1

func (t *Transaction) Accept(contentTypes ...string) *Transaction

Accept sets the Content-Type header of the HTTP request.

func (*Transaction) Body

func (t *Transaction) Body(value string) *Transaction

Body sets the request body, to be encoded as plain text

func (*Transaction) Client

func (t *Transaction) Client(client *http.Client) *Transaction

Client sets the HTTP client to use for the transaction.

func (*Transaction) ContentType

func (t *Transaction) ContentType(value string) *Transaction

ContentType sets the Content-Type header of the HTTP request.

func (*Transaction) Delete added in v0.16.0

func (t *Transaction) Delete(url string) *Transaction

Delete assigns the HTTP method and URL for this transaction.

func (*Transaction) Error added in v0.12.0

func (t *Transaction) Error(object any) *Transaction

Error sets the object for parsing HTTP error responses

func (*Transaction) Form

func (t *Transaction) Form(name string, value string) *Transaction

Form adds a name/value pair to the form data to be sent to the remote server.

func (*Transaction) Get added in v0.16.0

func (t *Transaction) Get(url string) *Transaction

Get assigns the HTTP method and URL for this transaction.

func (*Transaction) Header

func (t *Transaction) Header(name string, value string) *Transaction

Header sets a designated header value in the HTTP request.

func (*Transaction) JSON

func (t *Transaction) JSON(value any) *Transaction

JSON sets the request body, to be encoded as JSON.

func (*Transaction) MarshalJSON added in v0.16.3

func (t *Transaction) MarshalJSON() ([]byte, error)

MarshalJSON implements the json.Marhsaller interface, which writes the Transaction object to a JSON string.

func (*Transaction) MarshalMap added in v0.16.3

func (t *Transaction) MarshalMap() map[string]any

MarshalMap converts a Transaction object into a map[string]any

func (*Transaction) Method

func (t *Transaction) Method(method string) *Transaction

Method assigns the HTTP method for this transaction.

func (*Transaction) Patch added in v0.16.0

func (t *Transaction) Patch(url string) *Transaction

Patch assigns the HTTP method and URL for this transaction.

func (*Transaction) Post added in v0.16.0

func (t *Transaction) Post(url string) *Transaction

Post assigns the HTTP method and URL for this transaction.

func (*Transaction) Put added in v0.16.0

func (t *Transaction) Put(url string) *Transaction

Put assigns the HTTP method and URL for this transaction.

func (*Transaction) Query

func (t *Transaction) Query(name string, value string) *Transaction

Query sets a name/value pair in the URL query string.

func (*Transaction) RequestBody added in v0.12.0

func (t *Transaction) RequestBody() ([]byte, error)

RequestBody returns the serialized body of the request as a slice of bytes.

func (*Transaction) RequestURL added in v0.12.0

func (t *Transaction) RequestURL() string

RequestURL returns the full URL for this request, including query string parameters.

func (*Transaction) Response

func (t *Transaction) Response() *http.Response

Response returns the original HTTP response object.

func (*Transaction) ResponseBody added in v0.12.0

func (t *Transaction) ResponseBody() ([]byte, error)

ResponseBody returns the original response body, as a byte array. This method replaces the original body reader, meaning that it can be called multiple times without error.

func (*Transaction) ResponseBodyReader added in v0.12.0

func (t *Transaction) ResponseBodyReader() io.Reader

ResponseBodyReader returns an io.Reader for the response body.

func (*Transaction) ResponseContentType added in v0.12.0

func (t *Transaction) ResponseContentType() string

ResponseContentType returns the Content-Type header of the response.

func (*Transaction) ResponseHeader added in v0.12.0

func (t *Transaction) ResponseHeader() http.Header

ResponseHeader returns the HTTP response header.

func (*Transaction) ResponseStatusCode added in v0.12.0

func (t *Transaction) ResponseStatusCode() int

ResponseStatusCode returns the HTTP status code of the response.

func (*Transaction) Result added in v0.12.0

func (t *Transaction) Result(object any) *Transaction

Result sets the object for parsing HTTP success responses

func (*Transaction) Send

func (t *Transaction) Send() error

Send executes the transaction, sending the request to the remote server.

func (*Transaction) URL added in v0.16.3

func (t *Transaction) URL(url string) *Transaction

URL assigns the URL for this transaction.

func (*Transaction) UnmarshalJSON added in v0.16.3

func (t *Transaction) UnmarshalJSON(data []byte) error

UnmarshalJSON implements the json.Unmarshaler interface, which reads a Transaction object from a JSON string.

func (*Transaction) UnmarshalMap added in v0.16.3

func (t *Transaction) UnmarshalMap(value map[string]any) error

UnmarshalMap populates a Transaction object from a map[string]any

func (*Transaction) UserAgent added in v0.12.0

func (t *Transaction) UserAgent(value string) *Transaction

UserAgent sets the User-Agent header of the HTTP request.

func (*Transaction) With added in v0.16.0

func (t *Transaction) With(options ...Option) *Transaction

With lets you add remote.Options to the transaction. Options modify transaction data before and after it is sent to the remote server.

func (*Transaction) XML

func (t *Transaction) XML(value any) *Transaction

XML sets the request body, to be encoded as XML.

Directories

Path Synopsis
Package options is a library of common remote.Options that are useful for modifying the behavior of a remote.Transaction.
Package options is a library of common remote.Options that are useful for modifying the behavior of a remote.Transaction.

Jump to

Keyboard shortcuts

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