JSON API Phase 1: Setup

UPDATED MAR 2020: Updated versions of assumed software and the nvm install command, and moved some Swagger setup steps forward from part 3 to allow swagger to work with the referenced version of Node.

Setting up your projects

Welcome! Today you begin an adventure and you shall embark on a journey that will bring you fame and glory. You shall build an API server and a client app that shall wield its power! Are you excited?


Alright then, lets assume that silence is because you are speechless and waiting in anticipation. Lets go!


For the API, we'll be defining our schema with the Swagger (OpenAPI) specification, conforming to the JSON API specification, and implementing it all with an express server. Once that is all in place, we'll create an Ember app and utilize its JSONAPIAdapter to effortlessly integrate with the API. Furthermore, Ember Data uses the JSONAPIAdapter by default.

NOTE: For this tutorial series, we will be utilizing Swagger 2.0 specification. The OpenAPI 3.0 specification was released last year (2017), but there are currently only a limited number of implementation resources. You will find a wealth of knowledge and implementations which use the 2.0 spec. Nonetheless, I definitely encourage you to read up on version 3.0.

Your journey will be split across the following four phases:


This tutorial assumes that you have the following setup within your dev environment:

For Node, I highly recommend using a node version manager. Two popular ones are n and nvm. If you'd like to install nvm use the command below:

curl --output - https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash

See nvm on Github for more information

On the other hand, if you wish to forgo using a version manager, just install the latest LTS Carbon version of Node.

Project Setup

To setup both projects, we'll be employing two CLIs: Ember CLI and Swagger

To start off, create a project directory:

mkdir ember-jsonapi-demo && cd "$_"

Then install the ember cli:

npm install --global ember-cli
# or, equivalently
npm install -g ember-cli

And also install the swagger cli (swagger-node):

npm install -gq swagger

Ember Project

Use the Ember CLI to generate and configure the web client project:

ember new client
cd client
ember serve

In a moment, your ember client app should be up and running. Feel free to follow Ember's quick start if you'd like to learn more. Otherwise, if you load the web page now, it should look like this:

Initial Ember Homepage

API Server

Next we'll be using the swagger CLI tool to configure the API server project. The swagger CLI adds express-swagger-mw to your project. This package contains an express middleware wrapper around swagger-node-runner. swagger-node-runner is a swagger server implementation that uses bagpipes and sway. If your project has more complicated requirements, you'll want to dig into the documentation for these projects. For our use case, these swagger internals will just work out of the box.

If you haven't yet, use CTRL+C to stop the ember server, and enter the following commands:

cd ..
swagger project create api

The CLI should immediately prompt you to select a framework. For this demo, select express:

? Framework?
❯ express

Then cd into the directory:

cd api

We'll be using yarn to install other dependencies in Part 3, but in the meantime to get swagger running under our version of Node we need to perform some advance setup.

yarn install

Upgrade swagger-express-mw to the latest version:

yarn upgrade swagger-express-mw --latest

Add the swagger_params_parser pipe to swagger_controllers inside config/default.yaml:

      - onError: json_error_handler
      - cors
      - swagger_params_parser
      - swagger_security
      - _swagger_validate
      - express_compatibility
      - _router

Now we can run the server

swagger project start

Then, in another terminal window, use the command below to test with curl:

$ curl
{ "message": "Hello, Scott!" }

Congratulations! You've completed the project setup.

Stay tuned for Phase 2: Designing your API with Swagger and JSON API

Posts in this series

  • JSON API Phase 1: Setup
  • JSON API Phase 2: API Design
  • JSON API Phase 3: API Server
  • JSON API Phase 4: Ember