REST API Endpoints
We will create the router and look at how to test our endpoints
REST API endpoints#
Now that we have confirmed our bare bones work, we can start adding the endpoints, but first we need to add some error handling and create some helpers.
Every API you will find in the wild is different and opinionated, so the way you will learn from me will of course be the same! There is no one correct way of doing things, and some ways will be better than others for particular use cases.
In the following sections, we will be adding a lot of code, so let's prep our
import_map.json file before we begin.
Let's start with creating a unified response structure. One of the most important things when creating a serverwith multiple endpoints which will be consumed by a potential client, is to create standards. The most important standard to establish is the response structure.
We will be adhering to the web standards, and therefore also actively be usingHTTP status codes to
tell the requester how the request went. An alternative is to always return
200 - OK and be more verbose in the body, but I would personally not recommend
this as it is easier to be web compliant.
To be a bit more verbose, I always recommend to have a standard response body. This is my preferred format, which we will also use in this application:
But as creating this response for each endpoint can be a bit tiresome, we can add a helper function.
We will start by adding a couple of type helpers to
main.ts since we will need
it across our application, and now is a good time to add them.
AppStateis the global state which will contain global accessible properties. We add this state to our contexts, and you will see in a later module why this is useful.
AppContextis the base Context type which we use with middlewares.
AppRouterContextis the Router Context which we will use in our models and controllers.
AppRouterMiddlewareis the Router Middleware, it is used by our controllers.
Now, create a new folder
src and add to it the file
We want to keep the root project folder as clean as possible which is why we place as much code as possible into
src. The exceptions are
main.tsbecause it is an entry point, and
nessie.config.tsbecause it is a config file. The
dbfolder should be kept separate from the rest of the code.
Add the following method:
We are passing in four arguments, two of them optional. The first argument is the app context which contains the request and response object, the second is for setting the status code, the third one is the data that we want to send back, and the fourth one is to be used in case of any errors.
In certain applications, the response can include files or other data, but in our case, we know that we will always only return JSON. We therefore set the default value to an empty object.