Receive regular HTTP requests

Dropping down in abstraction level

Encore makes it easy to define APIs and expose them, but it works best when you are in charge of the API schema.

Sometimes you need more control over the underlying HTTP request, such as to accept incoming webhooks from other services, or to use WebSockets to stream data to/from the client.

For these use cases Encore lets you define raw endpoints. Raw endpoints operate at a lower abstraction level, giving you access to the underlying HTTP request.

Defining raw endpoints

To define a raw endpoint, change the //encore:api annotation and function signature like so:

package service import "net/http" // Webhook receives incoming webhooks from Some Service That Sends Webhooks. //encore:api public raw method=POST path=/webhook func Webhook(w http.ResponseWriter, req *http.Request) { // ... operate on the raw HTTP request ... }

If you're an experienced Go developer, this is just a regular Go HTTP handler.

See the net/http documentation for more information on how Go HTTP handlers work.

Reading path parameters

Sometimes webhooks have information in the path that you may be interested in retrieving or validating.

To do so, define the path with a path parameter, and then use encore.CurrentRequest to access the path parameters. For example:

package service import ( "net/http" "encore.dev" ) //encore:api public raw method=POST path=/webhook/:id func Webhook(w http.ResponseWriter, req *http.Request) { id := encore.CurrentRequest().PathParams.Get("id") // ... Do something with id }