-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathOPEN_API_DEFINITION.yaml
305 lines (302 loc) · 11.3 KB
/
OPEN_API_DEFINITION.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
openapi: '3.0.3'
info:
title: bttger/web-framework-benchmarks
description: |
### This is the OpenAPI Definition of the [bttger/web-framework-benchmarks](https://github.com/bttger/web-framework-benchmarks) project to benchmark the overhead ⚙️ and latency ⏱️ of different popular web frameworks.
It defines the interface which every web framework has to implement. The endpoints are chosen so that they cover the performance of the **routing**, **parsing** (of request parameters) and **serialization** (of responses) as distinctly as possible.
This definition contains the mandatory response data in the description of properties.
version: '0.1.0'
license:
name: MIT
url: https://github.com/bttger/web-framework-benchmarks/blob/master/LICENSE
servers:
- url: http://localhost:8080
paths:
/serialize:
get:
operationId: getSerialized
responses:
"200":
description: An object with a message property of the type string.
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: "Hello, World!"
/serialize/big:
get:
operationId: getSerializedBig
responses:
"200":
description: An object covering all JSON types and being relatively large.
content:
application/json:
schema:
type: object
properties:
family:
type: string
description: Elephantidae
scientificClassification:
type: object
properties:
kingdom:
type: string
description: Animalia
phylum:
type: string
description: Chordata
class:
type: string
description: Mammalia
order:
type: string
description: Proboscidea
superfamily:
type: string
description: Elephantoidea
classifier:
type: object
properties:
name:
type: string
description: John Edward Gray
born:
type: object
properties:
year:
type: integer
description: "1800"
month:
type: string
description: February
day:
type: integer
description: "12"
city:
type: string
description: Walsall
country:
type: string
description: England
died:
type: object
properties:
year:
type: integer
description: "1875"
month:
type: string
description: March
day:
type: integer
description: "7"
city:
type: string
description: London
country:
type: string
description: England
publications:
type: array
description: |
An array of 50 entries with publications of the classifier. Since we do not care about the content, we just generate
data with ascending year. The generation is solved on-demand and not with a pre-initialized object, to simulate the
language's performance losses when iterating through an (imaginary) database response.
items:
type: object
properties:
year:
type: integer
description: "1821"
related:
type: boolean
description: "true"
description:
type: string
description: Some discovery in 1821
/plain/text:
get:
operationId: getPlainText
responses:
"200":
description: Plain text outputting "Hello, World!"
content:
text/plain; charset=utf-8:
example:
"Hello, World!"
/query/{userId}/tools/{offset}:
get:
operationId: getQueryResult
description: The response has to confirm if an object with the queried properties is available.
parameters:
- name: userId
in: path
description: "300"
required: true
schema:
type: integer
- name: offset
in: path
description: "10"
required: true
schema:
type: integer
- name: x-api-key
in: header
description: zb478fb3
required: true
schema:
type: string
- name: x-session-id
in: header
description: jhg723bf
required: true
schema:
type: string
- name: model
in: query
description: Dozer
required: true
schema:
type: string
- name: factor
in: query
description: ATX
required: true
schema:
type: string
- name: length
in: query
description: "800"
required: true
schema:
type: integer
- name: width
in: query
description: "800"
required: true
schema:
type: integer
- name: allow
in: query
description: "true"
required: true
schema:
type: boolean
responses:
"200":
description: A confirmation object containing the corresponding id.
content:
application/json:
schema:
type: object
properties:
id:
type: integer
description: "6000"
foundAt:
type: string
description: 2020-07-25T18:59:33.384Z (Current time in ISO 8601 UTC Format)
/insert:
post:
operationId: insertObject
description: Parses the transmitted object, serializes it with an additional id and creation timestamp and returns it.
requestBody:
description: An object containing all information to create a new object.
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: Sample
addresses:
type: array
description: Two address items
items:
type: object
properties:
street:
type: string
description: Breite Straße
number:
type: integer
description: "292"
city:
type: string
description: Lübeck
oldTown:
type: boolean
description: "true"
example:
name: Sightseeing
addresses:
- street: Breite Straße
number: 89
city: Lübeck
- street: Breite Straße
number: 89
city: Lübeck
oldTown: true
responses:
"201":
description: A confirmation object containing the created object.
content:
application/json:
schema:
type: object
properties:
id:
type: integer
description: "300"
name:
type: string
description: Sample
addresses:
type: array
description: Two address items
items:
type: object
properties:
street:
type: string
description: Breite Straße
number:
type: integer
description: "292"
city:
type: string
description: Lübeck
oldTown:
type: boolean
description: "true"
createdAt:
type: string
description: 2020-07-25T18:59:33Z (Current time in ISO 8601 UTC Format)
/calculate:
get:
operationId: getCalculated
description: |
This endpoint actually does not benchmark the framework itself, but the ability of the language to take advantage of all available cores when running computationally intensive tasks.
The goal is that one request does not block the whole application and to keep the latency as low as possible.
Some frameworks have that feature built-in and others require developers to implement it manually using the language's core libraries.
**For the calculation of the fibonacci number we use the recursive implementation to increase the time complexity [O(2^N)].
It covers a realistic case of some backend computation, e.g. cryptographic functions. When tested on my machine, the 27th fibonacci number
took roughly the same time to calculate as the verification of a password with the `argon2i` algorithm (time cost value set to 3, hash length of 32 bytes, salt length of 16 bytes).**
responses:
"200":
description: An object returning the fibonacci number of 27.
content:
application/json:
schema:
type: object
properties:
fibonacci:
type: number
description: "317811"