Skip to content

Commit

Permalink
fixes #86 add tutorial for json object as query parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
stevehu committed May 13, 2019
1 parent b556c4b commit 8cffa5b
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 0 deletions.
11 changes: 11 additions & 0 deletions content/en/tutorial/rest/openapi/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,14 @@ aliases: []
toc: false
draft: false
---

This section contains tutorials based on the OpenAPI 3.0 specifications. As most of our users have switched to the OpenAPI 3.0, we are going to add more tutorials here instead of [Swagger 2.0][] section.

* [OpenAPI 3.0](/tutorial/rest/openapi/)
+ [OpenAPI 3.0 Petstore](/tutorial/rest/openapi/petstore/)
+ [JSON Query Parameter](/tutorial/rest/openapi/parameter-serialization/json-query-param/)
+ [Microservices Aggregate Pattern](/tutorial/rest/openapi/ms-aggregate/)
+ [Microservices Branch Pattern](/tutorial/rest/openapi/ms-branch/)


[Swagger 2.0]: /tutorial/rest/swagger/
29 changes: 29 additions & 0 deletions content/en/tutorial/rest/openapi/parameter-serialization/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
title: "Parameter Serialization"
date: 2019-05-13T15:16:43-04:00
description: ""
categories: []
keywords: []
slug: ""
aliases: []
toc: false
draft: false
reviewed: true
---

For most users, their use cases are straightforward in term of parameters; however, we do have some users have advanced use cases with [parameter serialization][].

OpenAPI 3.0 supports arrays and objects in operation parameters (path, query, header, and cookie) and lets you specify how these parameters should be serialized. The serialization method is defined by the `style` and `explode` keywords:

* `style` defines how multiple values are delimited. Possible styles depend on the parameter location – path, query, header or cookie.

* `explode` (true/false) specifies whether arrays and objects should generate separate parameters for each array item or object property.

OpenAPI serialization rules are based on a subset of URI template patterns defined by RFC 6570. Tool implementers can use existing URI template libraries to handle the serialization, as explained below.

In this tutorial, we are going to include some examples so that users can learn from them.

* [JSON query parameter](/tutorial/rest/openapi/parameter-serialization/json-query-param/)

[parameter serialization]: https://swagger.io/docs/specification/serialization/

Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
---
title: "JSON Query Parameter"
date: 2019-05-13T15:51:43-04:00
description: ""
categories: []
keywords: []
slug: ""
aliases: []
toc: false
draft: false
reviewed: true
---

`style` and `explode` cover the most common serialization methods, but not all. For more complex scenarios (for example, a JSON-formatted object in the query string), you can use the content keyword and specify the media type that defines the serialization format. Or you can use schema to define the JSON object. For more information, please visit [schema vs content][].

In this tutorial, we are going to create a service with one endpoint that accepts a JSON object as a query parameter. The use case is provided by one of our contributors @Dasanko in this [issue](https://github.com/networknt/light-rest-4j/issues/67)

To generate the example project, we need to create a specification file named openapi.yaml and a config.json for the light-codegen.

You can find these two files and a README.md in the [model-config][] repository. The following is the specification.

```
openapi: 3.0.0
info:
title: TestProject
version: 1.0.0
servers:
- url: 'https://localhost:8443/api'
paths:
/testEndPoint:
get:
parameters:
- in: query
name: TestObject
schema:
$ref: '#/components/schemas/TestObject'
responses:
'200':
description: History something something
content:
application/json:
schema:
type: string
components:
schemas:
TestObject:
type: object
properties:
testProperty:
type: string
```

To generate the project with light-codegen.

```
cd ~/networknt
rm -rf light-example-4j/rest/openapi/json-query-param
java -jar light-codegen/codegen-cli/target/codegen-cli.jar -f openapi -o light-example-4j/rest/openapi/json-query-param -m model-config/rest/openapi/json-query-param/openapi.yaml -c model-config/rest/openapi/json-query-param/config.json
```

If you don't want to generate the project yourself, you can check the generated project in the [light-example-4j][]

Now you can start the server in the light-example-4j folder.

```
cd ~/networknt/light-example-4j/rest/openapi/json-query-param
mvn clean install exec:exec
```

Once the server is up and running, you can issue the following commands from another terminal.

```
curl -k -X GET https://localhost:8443/api/testEndPoint?TestObject={testProperty=testing}
curl -k -X GET https://localhost:8443/api/testEndPoint?TestObject=testProperty,testing
curl -k -X GET https://localhost:8443/api/testEndPoint?testProperty=testing
curl -k -X GET https://localhost:8443/api/testEndPoint?TestObject[testProperty]=testing
```

All the above commands should pass the light-rest-4j OpenAPI validator without any error. As there is no business logic implemented in the example application, the response body is empty with a response code of 200.

If you are interested, you can add the business logic to get the input parameter and return something meaningful.

[schema vs content]: https://swagger.io/docs/specification/describing-parameters/#schema-vs-content
[model-config]: https://github.com/networknt/model-config/tree/master/rest/openapi/json-query-param
[light-example-4j]: https://github.com/networknt/light-example-4j/tree/master/rest/openapi/json-query-param
10 changes: 10 additions & 0 deletions content/en/tutorial/rest/swagger/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,14 @@ slug: ""
aliases: []
toc: false
draft: false
reviewed: true
---

This section contains tutorials based on the Swagger 2.0 specifications. As most of our users have switched to the [OpenAPI 3.0][], we are still in a process to migrate everything from Swagger 2.0 to [OpenAPI 3.0][]. It is likely these tutorials will be changed in the future.

* [Swagger 2.0](/tutorial/rest/swagger/)
+ [Swagger 2.0 Petstore](/tutorial/rest/swagger/petstore/)
+ [Restful Database Access](/tutorial/rest/swagger/database/)
+ [Microservices Chain Pattern](/tutorial/rest/swagger/ms-chain/)

[OpenAPI 3.0]: /tutorial/rest/openapi/

0 comments on commit 8cffa5b

Please sign in to comment.