swagger
Version:
The Swagger command-line. Provides Swagger utilities and project lifecycle support.
121 lines (87 loc) • 4.31 kB
Markdown
## About controllers
* [Implementing a controller](#implementing)
* [Using query parameters](#query)
* [Weather API example](#weather)
### <a name="implementing"></a>Implementing a controller
This topic explains how to implement a controller. The `x-swagger-router-controller` Swagger extension element is used to specify the name of a controller file. The quick start example defines a `hello_world` controller file, which is by default in `api/controllers/hello_world.js`.
```yaml
paths:
/hello:
# binds swagger app logic to a route
x-swagger-router-controller: hello_world
```
By default, controller method names map to the HTTP operation names, like get() or post(). But you can specify any name you wish with the `operationId` element. In the following example, a GET request results in calling the hello() method in the controller.
```yaml
get:
description: Returns 'Hello' to the caller
# used as the method name of the controller
operationId: hello
```
Here is the `hello_world.js` implementation for the quick start example. It retrieves the query parameter value and returns a response.
```javascript
var util = require('util');
module.exports = {
hello: hello
};
function hello(req, res) {
var name = req.swagger.params.name.value;
var hello = name ? util.format('Hello, %s', name) : 'Hello, stranger!';
res.json(hello);
}
```
### <a name="query"></a>Using query parameters
In the controller code, we obtained the value of a query parameter and echoed it back in the response. We used the `req.swagger` object to obtain access to the query parameters. You declare query parameters in the paths section of the project's Swagger definition. For example:
```yaml
parameters:
- name: name
in: query
description: The name of the person to whom to say hello
required: false
type: string
```
The req.swagger object is populated by the swagger-tools middleware component of swagger. To read more about this object, see the [Swagger tools middleware documentation](https://github.com/apigee-127/swagger-tools/blob/master/docs/Middleware.md).
### <a name="weather"></a>Weather API example
Let's look at an example controller for a simple weather API.
The Weather API requires a controller function that takes in request and response objects, queries the Open Weather Map API using the `city` query parameter and returns the current weather conditions.
Note that Open Weather returns a JSON object. Also, we'll need to export the controller function so that it is available to the outside world.
We will use the `request` library to make the request. So, add it to `package.json`:
```javascript
"dependencies": {
"request": ""
},
```
>Note: If a controller requires additional Node.js modules, be sure to add them to your package.json file and execute `npm install`.
In the Swagger file, you can see that when a GET is performed on `/weather`, the target controller file is `api/controllers/weather.js`, and the target method to call is getWeatherByCity():
```yaml
paths:
/weather:
x-swagger-router-controller: weather
get:
description: "Returns current weather in the specified city to the caller"
operationId: getWeatherByCity
parameters:
- name: city
in: query
description: "The city you want weather for in the form city,state,country"
required: true
type: "string"
```
Here is the controller implementation for the `getWeatherByCity` function:
```javascript
'use strict';
var util = require('util');
var request = require('request');
module.exports = {
getWeatherByCity: getWeatherByCity
}
function getWeatherByCity(req, res) {
var city = req.swagger.params.city.value;
var url = "http://api.openweathermap.org/data/2.5/weather?q="+city+"&units=imperial";
console.log('Executing request: '+url);
request.get(url).pipe(res);
};
```
Here is how you call the Weather API, which returns data for a specified city.
```bash
curl http://localhost:10010/weather\?city\=San%20Jose,CA
```