Files
spring-restdocs/README.md
Rossen Stoyanchev e98658266c Update README.md to include link to presentation
Rework the opening paragraph and include a link to the Documenting
RESTful APIs presentation given at Spring Exchange 2014.

Closes gh-2
2014-11-13 15:17:29 +00:00

147 lines
5.0 KiB
Markdown

## Goal
The primary goal of the project is to make it easy to document RESTful services by
combining content that's been hand-written using [AsciiDoctor][1] with auto-generated
examples produced with the [Spring MVC Test][2] framework. The result is intended to
be an easy-to-read user guide, akin to [GitHub's API documentation][3] for example,
rather than the fully automated, dense API documentation produced by tools like
[Swagger][4].
For a broader introduction see the [Documenting RESTful APIs][9] presentation.
## Quickstart
The project requires Java 7 or later. It's built with Gradle:
```
$ ./gradlew build install
```
Once the main project's built, take a look at one of the two sample projects. Both
projects implement a RESTful service for creating tagged notes but have different
implementations: `rest-notes-spring-hateoas` is implemented using Spring MVC and Spring
Hateoas while `rest-notes-spring-data-rest` is implemented using Spring Data REST.
To see the sample project's documentation move into its directory and use Gradle to
build the documentation. For example:
```
$ cd rest-notes-spring-data-rest
$ ./gradlew restDocumentation
```
Once the build is complete, open one of the following:
- build/asciidoc/getting-started-guide.html
- build/asciidoc/api-guide.html
Every example request and response in the documentation is auto-generated using custom
Spring MVC Test result handlers. This ensures that the examples match the service that
they are documenting.
## How does it work
There are three main pieces involved in using this project to document your RESTful
service.
### Gradle plugin
A Gradle plugin is provided. This plugin builds on top of the [AsciiDoctor plugin][5]
and is responsible for producing the documentation during the build. Assuming you've
built and installed the project as described in the quick start, the plugin as
configured in your project as follows:
```groovy
buildscript {
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'org.springframework.restdocs:spring-restdocs-gradle-plugin:0.1.0.BUILD-SNAPSHOT'
}
}
apply plugin: 'org.springframework.restdocs'
```
### Programatically generated snippets
Spring's MVC Test framework is used to make requests to the service that you are
documenting. Any such request wrapped in a call to `RestDocumentation.document` will
produce individual documentation snippets for its request and its response as well as
a snippet that contains both its request and its response.
You can configure the scheme, host, and port of any URIs that appear in the
documentation snippets:
```java
@Before
public void setUp() {
this.mockMvc = MockMvcBuilders
.webAppContextSetup(this.context)
.apply(new RestDocumentationConfiguration()
.withScheme("https")
.withHost("localhost")
.withPort(8443))
.build();
}
```
The default values are `http`, `localhost`, and `8080`. You can omit the above
configuration if these defaults meet your needs.
To document a MockMvc call, wrap it in a call to `RestDocumentation.document`:
```java
public void getIndex() {
document("index", this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)));
}
```
The code above will perform a `GET` request against the index (`/`) of the service with
an accept header indicating that a JSON response is required. It will write the cURL
command for the request and the resulting response to files in a directory named
`index` in the project's `build/generated-documentation/` directory. Three files will
be written:
- `index/request.asciidoc`
- `index/response.asciidoc`
- `index/request-response.asciidoc`
### Documentation written in Asciidoc
Producing high-quality, easily readable documentation is difficult and the process is
only made harder by trying to write the documentation in an ill-suited format such as
Java annotations. This project addresses this by allowing you to write the bulk of
your documentation's text as an Asciidoc document. These files should be placed in
`src/documentation/asciidoc`.
To include the programmatically generated snippets in your documentation, you use
Asciidoc's [`include` macro][6]. The Gradle plugin provides an attribute, `generated`,
that you can use to reference the directory to which the snippets are written. For
example, to include both the request and response snippets described above:
```
include::{generated}/index/request.asciidoc[]
include::{generated}/index/response.asciidoc[]
```
## Learning more
To learn more, take a look at the accompanying sample projects:
- [rest-notes-spring-data-rest][7]
- [rest-notes-spring-hateoas][8]
[1]: http://asciidoctor.org
[2]: http://docs.spring.io/spring-framework/docs/4.1.1.RELEASE/spring-framework-reference/html/testing.html#spring-mvc-test-framework
[3]: https://developer.github.com/v3/
[4]: http://swagger.io
[5]: http://plugins.gradle.org/plugin/org.asciidoctor.gradle.asciidoctor
[6]: http://www.methods.co.nz/asciidoc/userguide.html#_system_macros
[7]: rest-notes-spring-data-rest
[8]: rest-notes-spring-hateoas
[9]: https://speakerdeck.com/ankinson/documenting-restful-apis