Getting started

Let’s look into the basics.

The basics - “hello world” with mock

The simplest way of defining an endpoint’s response is simply using the response field within an endpoint object:

 {
   "endpoints": [
     {
       "route": "foo/bar",
       "response": "Hello, world!"
     }
   ]
}

The exact same can also be accomplished with just command-line parameters:

$ mock serve \
  --route "foo/bar" \
  --response 'Hello, world!'

For simple APIs, static response such as the ones above might be enough. But we’re not limited to that.

mock sets no boundaries when it comes to building APIs. You have all the capability of the shell environment at your disposal for building APIs.

mock as an API framework

mock lets you use shell scripts as “response handlers” for your endpoints.

$ mock serve \
  --route "/users" \
  --method "GET" \
  --shell-script 'get_users.sh' \
  --route "/users" \
  --method "POST" \
  --shell-script 'create_user.sh'

Above we have an API with a /users route, that can be requested with either GET or POST methods. The shell script files get_users.sh and create_user.sh will be executed respectively, acting as response handlers for these endpoints.

Inside your response handlers you can use mock to build HTTP Responses.

mock write is one such utility. It sends data to the requesting client. Let’s see a simple example:

# get_users.sh

USERS=$(mysql ... -c "SELECT * FROM users")

# convert the user sql result to JSON somehow...

echo "${USERS}" | mock write

You can read more about shell scripts and shell utilities in the following links:

HTTP Headers

The optional response_headers endpoint parameter will add headers to a endpoint’s response:

 {
   "endpoints": [
     {
       "route": "foo/bar",
       "response": {
         "foo": "bar"
       },
+      "response_headers": {
+        "Some-Header-Key": "Some header value",
+        "Another-Header-Key": "Another header value"
+      }
     }
   ]
}

To add response headers to an endpoint using command-line parameters:

 $ mock serve \
   --route "foo/bar" \
   --response '{"foo":"bar"}' \
+  --header "Some-Header-Key: Some header value" \
+  --header "Another-Header-Key: Another header value"

If you’re using shell scripts as response handlers, then setting up headers is quite easy. Let’s use mock set-header to add a Foo: bar HTTP Header to our API response:

 $ mock serve \
   --route "foo/bar" \
+  --exec 'mock set-header foo bar'

HTTP Status Code

By default, all responses’ status code will be 200. You can change it using the response_status_code option:

 {
   "endpoints": [
     {
       "route": "foo/bar",
       "method": "POST",
       "response": {
         "foo": "bar"
       },
+      "response_status_code": 201
     }
   ]
}

To add response status codes to an endpoint using command-line parameters:

 $ mock serve \
   --route "foo/bar" \
   --method "POST" \
   --response '{"foo":"bar"}' \
+  --status-code 201