The goa Request Context


Overview

The request context is the data structure provided to all goa controller action methods as first parameter. It leverages the work done by the Go team around passing contexts across interface boundaries by wrapping the context.Context interface in a generated struct.

goa leverages code generation to define action specific fields that provide access to the request state using “typed” methods. So for example if a path parameter called ID is defined in the design as being of type Integer the corresponding controller action method accepts a context data structure which exposes a field named ID of type int. The same goes for the request payload so that accessing the Payload field of an action context returns a data structure that is specific to that action as described in the design. This alleviates the need for reflection or otherwise “binding” the context to a struct.

This also applies to writing responses: while the underlying http ResponseWriter is available to write the response, the action context also provides action specific methods for writing the responses described in the design. These generated methods take care of writing the correct status code and content-type header for example. They also make it possible to specify the response body using custom data structures generated from the media type described in the design.

Context Functions

The goa package exposes a set of functions all prefixed with Context that can be used to extract data stored in the request context. For example ContextResponse extracts the response data from the given context. These functions are mainly useful to code that does not have access to the generated data structures but merely to the raw context.Context value such as middleware.

The goa package also exposes functions prefixed with With that accept a context and return a new context that embeds the additional data provided to the function, for example WithLogger sets the logger in the returned context.

Setting Deadlines

As mentioned earlier each controller action context wraps a golang package context. This means that deadlines and cancelation signals are available to all action implementations. The built-in Timeout middleware takes advantage of this ability to let services or controllers define a timeout value for all requests.