Documentation
¶
Overview ¶
Package jsh (JSON API Specification Handler) makes it easy to parse JSON API requests and send responses that match the JSON API Specification: http://jsonapi.org/ from your server.
For a request client, see: jsc: https://godoc.org/github.com/derekdowling/go-json-spec-handler/client
For a full http.Handler API builder see jshapi: https://godoc.org/github.com/derekdowling/jsh-api
Index ¶
- Constants
- Variables
- func CreateReadCloser(data []byte) io.ReadCloser
- func NewObject(id string, resourceType string, attributes interface{}) (*Object, *Error)
- func ParseDoc(r *http.Request, mode DocumentMode) (*Document, *Error)
- func ParseList(r *http.Request) (List, *Error)
- func ParseObject(r *http.Request) (*Object, *Error)
- type Document
- func (d *Document) AddError(newErr *Error) *Error
- func (d *Document) AddObject(object *Object) *Error
- func (d *Document) Error() string
- func (d *Document) First() *Object
- func (d *Document) HasData() bool
- func (d *Document) HasErrors() bool
- func (d *Document) MarshalJSON() ([]byte, error)
- func (d *Document) Validate(r *http.Request, isResponse bool) *Error
- type DocumentMode
- type Error
- func ISE(internalMessage string) *Error
- func InputError(msg string, attribute string) *Error
- func NotFound(resourceType string, id string) *Error
- func Send(w http.ResponseWriter, r *http.Request, payload Sendable) *Error
- func SendDocument(w http.ResponseWriter, r *http.Request, document *Document) *Error
- func SpecificationError(detail string) *Error
- type ErrorList
- type ErrorType
- type Link
- type Links
- type List
- type Object
- type Parser
- type Relationship
- type ResourceIdentifier
- type ResourceLinkage
- type Sendable
Constants ¶
const (
// ContentType is the data encoding of choice for HTTP Request and Response Headers
ContentType = "application/vnd.api+json"
)
const JSONAPIVersion = "1.1"
JSONAPIVersion is version of JSON API Spec that is currently compatible: http://jsonapi.org/format/1.1/
Variables ¶
var DefaultErrorDetail = "Request failed, something went wrong."
DefaultError can be customized in order to provide a more customized error Detail message when an Internal Server Error occurs. Optionally, you can modify a returned jsh.Error before sending it as a response as well.
var DefaultErrorTitle = "Internal Server Error"
DefaultTitle can be customized to provide a more customized ISE Title
Functions ¶
func CreateReadCloser ¶
func CreateReadCloser(data []byte) io.ReadCloser
CreateReadCloser is a helper function for dealing with creating HTTP requests
func NewObject ¶
NewObject prepares a new JSON Object for an API response. Whatever is provided as attributes will be marshalled to JSON.
func ParseDoc ¶
func ParseDoc(r *http.Request, mode DocumentMode) (*Document, *Error)
ParseDoc parses and returns a top level jsh.Document. In most cases, using "ParseList" or "ParseObject" is preferable.
func ParseList ¶
ParseList validates the HTTP request and returns a resulting list of objects parsed from the request Body. Use just like ParseObject.
func ParseObject ¶
ParseObject validates the HTTP request and returns a JSON object for a given io.ReadCloser containing a raw JSON payload. Here's an example of how to use it as part of your full flow.
func Handler(w http.ResponseWriter, r *http.Request) { obj, error := jsh.ParseObject(r) if error != nil { // log your error err := jsh.Send(w, r, error) return } yourType := &YourType{} err := object.Unmarshal("yourtype", &yourType) if err != nil { err := jsh.Send(w, r, err) return } yourType.ID = obj.ID // do business logic err := object.Marshal(yourType) if err != nil { // log error err := jsh.Send(w, r, err) return } err := jsh.Send(w, r, object) }
Types ¶
type Document ¶
type Document struct { Data List `json:"data"` // Object *Object `json:"-"` Errors ErrorList `json:"errors,omitempty"` Links *Link `json:"links,omitempty"` Included []*Object `json:"included,omitempty"` Meta interface{} `json:"meta,omitempty"` JSONAPI struct { Version string `json:"version"` } `json:"jsonapi"` // Status is an HTTP Status Code Status int `json:"-"` // DataMode to enforce for the document Mode DocumentMode `json:"-"` // contains filtered or unexported fields }
Document represents a top level JSON formatted Document. Refer to the JSON API Specification for a full descriptor of each attribute: http://jsonapi.org/format/#document-structure
func Build ¶
Build creates a Sendable Document with the provided sendable payload, either Data or errors. Build also assumes you've already validated your data with .Validate() so it should be used carefully.
func Ok ¶
func Ok() *Document
Ok makes it simple to return a 200 OK response via jsh:
jsh.SendDocument(w, r, jsh.Ok())
func (*Document) AddError ¶
AddError adds an error to the Document. It will also set the document Mode to "ErrorMode" if not done so already.
func (*Document) AddObject ¶
AddObject adds another object to the JSON Document after validating it.
func (*Document) MarshalJSON ¶
MarshalJSON handles the custom serialization case caused by case where the "data" element of a document might be either a single resource object, or a collection of them.
type DocumentMode ¶
type DocumentMode int
DocumentMode allows different specification settings to be enforced based on the specified mode.
const ( // ObjectMode enforces fetch request/response specifications ObjectMode DocumentMode = iota // ListMode enforces listing request/response specifications ListMode // ErrorMode enforces error response specifications ErrorMode )
type Error ¶
type Error struct { Title string `json:"title"` Detail string `json:"detail"` Status int `json:"status,string"` Source struct { Pointer string `json:"pointer"` } `json:"source"` ISE string `json:"-"` }
Error consists of a number of contextual attributes to make conveying certain error type simpler as per the JSON API specification: http://jsonapi.org/format/#error-objects
error := &jsh.Error{ Title: "Authentication Failure", Detail: "Category 4 Username Failure", Status: 401 } jsh.Send(w, r, error)
func ISE ¶
ISE is a convenience function for creating a ready-to-go Internal Service Error response. The message you pass in is set to the ErrorObject.ISE attribute so you can gracefully log ISE's internally before sending them.
func InputError ¶
InputError creates a properly formatted HTTP Status 422 error with an appropriate user safe message. The parameter "attribute" will format err.Source.Pointer to be "/data/attributes/<attribute>".
func Send ¶
Send will return a JSON payload to the requestor. If the payload response validation fails, it will send an appropriate error to the requestor and will return the error
func SendDocument ¶
SendDocument handles sending a fully prepared JSON Document. This is useful if you require custom validation or additional build steps before sending.
SendJSON is designed to always send a response, but will also return the last error it encountered to help with debugging in the event of an Internal Server Error.
func SpecificationError ¶
SpecificationError is used whenever the Client violates the JSON API Spec
func (*Error) Error ¶
Error will print an internal server error if set, or default back to the SafeError() format if not. As usual, err.Error() should not be considered safe for presentation to the end user, use err.SafeError() instead.
func (*Error) StatusCode ¶
StatusCode (HTTP) for the error. Defaults to 0.
type ErrorList ¶
type ErrorList []*Error
ErrorList is wraps an Error Array so that it can implement Sendable
func (ErrorList) StatusCode ¶
StatusCode (HTTP) of the first error in the list. Defaults to 0 if the list is empty or one has not yet been set for the first error.
type ErrorType ¶
type ErrorType interface { // Error returns a formatted error and allows it to conform to the stdErr // interface. Error() string // Validate checks that the error is valid in the context of JSONAPI Validate(r *http.Request, response bool) *Error // StatusCode returns the first encountered HTTP Status Code for the error type. // Returns 0 if none is set. StatusCode() int }
ErrorType represents the common interface requirements that libraries may specify if they would like to accept either a single error or a list.
type Link ¶
type Link struct { HREF string `json:"href,omitempty"` Meta map[string]interface{} `json:"meta,omitempty"` }
Link is a JSON format type
type List ¶
type List []*Object
List is just a wrapper around an object array that implements Sendable
func (*List) UnmarshalJSON ¶
UnmarshalJSON allows us to manually decode a list via the json.Unmarshaler interface.
type Object ¶
type Object struct { Type string `json:"type" valid:"required"` ID string `json:"id"` Attributes json.RawMessage `json:"attributes,omitempty"` Links map[string]*Link `json:"links,omitempty"` Relationships map[string]*Relationship `json:"relationships,omitempty"` Meta map[string]interface{} `json:"meta,omitempty"` // Status is the HTTP Status Code that should be associated with the object // when it is sent. Status int `json:"-"` }
Object represents the default JSON spec for objects
func (*Object) Marshal ¶
Marshal allows you to load a modified payload back into an object to preserve all of the data it has.
func (*Object) Unmarshal ¶
Unmarshal puts an Object's Attributes into a more useful target resourceType defined by the user. A correct object resourceType specified must also be provided otherwise an error is returned to prevent hard to track down situations.
Optionally, used https://github.com/go-validator/validator for request input validation. Simply define your struct with valid input tags:
struct { Username string `json:"username" valid:"required,alphanum"` }
As the final action, the Unmarshal function will run govalidator on the unmarshal result. If the validator fails, a Sendable error response of HTTP Status 422 will be returned containing each validation error with a populated Error.Source.Pointer specifying each struct attribute that failed. In this case, all you need to do is:
errors := obj.Unmarshal("mytype", &myType) if errors != nil { // log errors via error.ISE jsh.Send(w, r, errors) }
type Parser ¶
Parser is an abstraction layer that helps to support parsing JSON payload from many types of sources, and allows other libraries to leverage this if desired.
func (*Parser) Document ¶
func (p *Parser) Document(payload io.ReadCloser, mode DocumentMode) (*Document, *Error)
Document returns a single JSON data object from the parser. In the process it will also validate any data objects against the JSON API.
type Relationship ¶
type Relationship struct { Links *Links `json:"links,omitempty"` Data ResourceLinkage `json:"data,omitempty"` Meta map[string]interface{} `json:"meta,omitempty"` }
Relationship represents a reference from the resource object in which it's defined to other resource objects.
type ResourceIdentifier ¶
type ResourceIdentifier struct { Type string `json:"type" valid:"required"` ID string `json:"id" valid:"required"` }
ResourceIdentifier identifies an individual resource.
type ResourceLinkage ¶
type ResourceLinkage []*ResourceIdentifier
ResourceLinkage is a typedef around a slice of resource identifiers. This allows us to implement a custom UnmarshalJSON.
func (*ResourceLinkage) UnmarshalJSON ¶
func (rl *ResourceLinkage) UnmarshalJSON(data []byte) error
UnmarshalJSON allows us to manually decode a the resource linkage via the json.Unmarshaler interface.
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
Godeps
|
|
_workspace/src/github.com/asaskevich/govalidator
Package govalidator is package of validators and sanitizers for strings, structs and collections.
|
Package govalidator is package of validators and sanitizers for strings, structs and collections. |
_workspace/src/github.com/derekdowling/go-stdlogger
Package std is the missing standard logging interface that should be present within Go.
|
Package std is the missing standard logging interface that should be present within Go. |
_workspace/src/github.com/derekdowling/jsh-api
Package jshapi is a http.Handler compatible wrapper that makes building JSON API resource handlers easy.
|
Package jshapi is a http.Handler compatible wrapper that makes building JSON API resource handlers easy. |
_workspace/src/github.com/derekdowling/jsh-api/store
Package store is a collection of composable interfaces that are can be implemented in order to build a storage driver
|
Package store is a collection of composable interfaces that are can be implemented in order to build a storage driver |
_workspace/src/github.com/jtolds/gls
Package gls implements goroutine-local storage.
|
Package gls implements goroutine-local storage. |
_workspace/src/github.com/smartystreets/assertions
Package assertions contains the implementations for all assertions which are referenced in goconvey's `convey` package (github.com/smartystreets/goconvey/convey) for use with the So(...) method.
|
Package assertions contains the implementations for all assertions which are referenced in goconvey's `convey` package (github.com/smartystreets/goconvey/convey) for use with the So(...) method. |
_workspace/src/github.com/smartystreets/assertions/internal/oglematchers
Package oglematchers provides a set of matchers useful in a testing or mocking framework.
|
Package oglematchers provides a set of matchers useful in a testing or mocking framework. |
_workspace/src/github.com/smartystreets/assertions/internal/oglemock/createmock
createmock is used to generate source code for mock versions of interfaces from installed packages.
|
createmock is used to generate source code for mock versions of interfaces from installed packages. |
_workspace/src/github.com/smartystreets/assertions/internal/oglemock/generate
Package generate implements code generation for mock classes.
|
Package generate implements code generation for mock classes. |
_workspace/src/github.com/smartystreets/assertions/internal/oglemock/generate/test_cases/complicated_pkg
Package complicated_pkg contains an interface with lots of interesting cases, for use in integration testing.
|
Package complicated_pkg contains an interface with lots of interesting cases, for use in integration testing. |
_workspace/src/github.com/smartystreets/assertions/internal/oglemock/generate/test_cases/renamed_pkg
A package that calls itself something different than its package path would have you believe.
|
A package that calls itself something different than its package path would have you believe. |
_workspace/src/github.com/smartystreets/assertions/internal/ogletest
Package ogletest provides a framework for writing expressive unit tests.
|
Package ogletest provides a framework for writing expressive unit tests. |
_workspace/src/github.com/smartystreets/assertions/internal/ogletest/srcutil
Functions for working with source code.
|
Functions for working with source code. |
_workspace/src/github.com/smartystreets/assertions/internal/reqtrace
Package reqtrace contains a very simple request tracing framework.
|
Package reqtrace contains a very simple request tracing framework. |
_workspace/src/github.com/smartystreets/assertions/should
package should is simply a rewording of the assertion functions in the assertions package.
|
package should is simply a rewording of the assertion functions in the assertions package. |
_workspace/src/github.com/smartystreets/goconvey/convey
Package convey contains all of the public-facing entry points to this project.
|
Package convey contains all of the public-facing entry points to this project. |
_workspace/src/github.com/smartystreets/goconvey/convey/gotest
Package gotest contains internal functionality.
|
Package gotest contains internal functionality. |
_workspace/src/github.com/smartystreets/goconvey/convey/reporting
Package reporting contains internal functionality related to console reporting and output.
|
Package reporting contains internal functionality related to console reporting and output. |
_workspace/src/github.com/zenazn/goji/web/mutil
Package mutil contains various functions that are helpful when writing http middleware.
|
Package mutil contains various functions that are helpful when writing http middleware. |
_workspace/src/goji.io
Package goji is a minimalistic and flexible HTTP request multiplexer.
|
Package goji is a minimalistic and flexible HTTP request multiplexer. |
_workspace/src/goji.io/internal
Package internal is a private package that allows Goji to expose a less confusing interface to its users.
|
Package internal is a private package that allows Goji to expose a less confusing interface to its users. |
_workspace/src/goji.io/middleware
Package middleware contains utilities for Goji Middleware authors.
|
Package middleware contains utilities for Goji Middleware authors. |
_workspace/src/goji.io/pat
Package pat is a URL-matching domain-specific language for Goji.
|
Package pat is a URL-matching domain-specific language for Goji. |
_workspace/src/goji.io/pattern
Package pattern contains utilities for Goji Pattern authors.
|
Package pattern contains utilities for Goji Pattern authors. |
_workspace/src/golang.org/x/net/context
Package context defines the Context type, which carries deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes.
|
Package context defines the Context type, which carries deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes. |
_workspace/src/golang.org/x/net/context/ctxhttp
Package ctxhttp provides helper functions for performing context-aware HTTP requests.
|
Package ctxhttp provides helper functions for performing context-aware HTTP requests. |
Package jsc (JSON Specification Client) is an http client that makes sending HTTP requests that match the JSON Specification: http://jsonapi.org/ simple.
|
Package jsc (JSON Specification Client) is an http client that makes sending HTTP requests that match the JSON Specification: http://jsonapi.org/ simple. |