Swagger-JS
New!
This is the new version of swagger-js, 3.x. Want to learn more? Check out our FAQ.
For the older version of swagger-js, refer to the 2.x branch.
Note:
The npm package is called swagger-client
and the GitHub repository is swagger-js
.
We'll be consolidating that soon. Just giving you the heads up. You may see references to both names.
Usage
Prerequisites
- Runtime:
- browser: es5 compatible. IE11+
- node v4.x.x
- Building
Download via npm
npm install swagger-client
Import in code
import Swagger from 'swagger-client'
const Swagger = require('swagger-client')
Import in browser
<script src='browser/swagger-client.js' type='text/javascript'></script>
<script>
var swaggerClient = new SwaggerClient(specUrl);
</script>
API
This lib exposes these functionalities:
- Static functions for...
- HTTP Client
- Swagger Spec Resolver ( OAS 2.0 )
- TryItOut Executor
- A constructor with the methods...
- HTTP Client, for convenience
- Swagger Spec Resolver ( OAS 2.0 ), which will use
url
or spec
from the instance - TryItOut Executor, bound to the
http
and spec
instance properties - Tags Interface, also bound to the instance
HTTP Client
Swagger.http(req)
exposes a Fetch-like interface with a twist: allowing url
in the request object so that it can be passed around and mutated. It extends Fetch to support request and response interceptors and performs response & header serialization. This method could be overridden to change how SwaggerJS performs HTTP requests.
const request = {
url,
query,
method,
body,
headers,
requestInterceptor,
responseInterceptor,
userFetch
}
Swagger.http(request)
.then((res) => {
res.statusCode
res.statusText
res.body
res.obj
res.text
res.headers
})
.catch((err) => {
err
err.response
})
Swagger.http({
requestInterceptor: (req: Request) => Request
responseInterceptor: (res: Response) => Response
})
Swagger.http({
userFetch: (url: String, options: Object) => Promise
})
Swagger Specification Resolver
Swagger.resolve({url, spec, http})
resolves $ref
s (JSON-Refs) with the objects they point to.
Swagger.resolve({url, spec, http}).then((resolved) => {
resolved.errors
resolved.spec
})
This is done automatically if you use the constructor/methods
TryItOut Executor
An HTTP client for OAS operations, maps an operation and values into an HTTP request.
const params = {
spec,
operationId,
(pathName),
(method),
parameters,
securities,
requestContentType,
responseContentType,
(http),
(userFetch),
}
const res = Swagger.execute({...params})
const req = Swagger.buildRequest({...params})
Constructor and methods
Resolve the spec and expose some methods that use the resolved spec:
Swagger(url, opts): Promise
- Exposes tags interface (see above)
- Exposes the static functions:
execute
, http
, resolve
and some other minor ones - Exposes
#http
, #execute
and #resolve
bound to the instance
Swagger('http://petstore.swagger.io/v2/swagger.json')
.then( client => {
client.spec
client.originalSpec
client.errors
client.apis.pet.addPet({id: 1, name: "bobby"}).then(...)
client.execute({operationId: 'addPet', parameters: {id: 1, name: "bobby") }).then(...)
})
Tags Interface
A client for operations. We're currently using the apis[tag][operationId]:ExecuteFunction
interface, which can be disabled entirely using Swagger({disableInterfaces: true})
if you don't need it.
OperationId's are meant to be unique within spec, if they're not we do the following:
- If a tag is absent, we use
default
as the internal tag - If an operationId is missing, we deduce it from the http method and path, i.e.
${method}${path}
, with non-alphanumeric characters escaped to _
. See these tests (1, 2) for examples. - If an operationId is duplicated across all operationIds of the spec, we rename all of them with numbers after the ID to keep them unique. You should not rely on this, as the renaming is non-deterministic. See this test for an example.
Swagger({...}).then((client) => {
client
.apis
.pet
.addPet({id: 1, name: "bobby"})
.then(...)
})
In Browser
Prepare swagger-client.js by npm run build-bundle
Note, browser version exports class SwaggerClient
to global namespace
If you need activate CORS requests, just enable it by withCredentials
property at http
<html>
<head>
<script src='browser/swagger-client.js' type='text/javascript'></script>
<script>
var specUrl = 'http://petstore.swagger.io/v2/swagger.json';
var swaggerClient = new SwaggerClient(specUrl)
.then(function (swaggerClient) {
swaggerClient.http.withCredentials = true;
return swaggerClient.apis.pet.addPet({id: 1, name: "bobby"});
}, function (reason) {
console.error("failed to load the spec" + reason);
})
.then(function(addPetResult) {
console.log(addPetResult.obj);
}, function (reason) {
console.error("failed on API call " + reason);
});
})
</script>
</head>
<body>
check console in browser's dev. tools
</body>
</html>
Compatibility
SwaggerJS has some legacy signature shapes.
Execute
Response shape
{
url,
method,
status,
statusText,
headers,
data,
obj
}
{
url,
method,
status,
statusText,
headers,
text,
body,
}
By default the instance version of #http
serializes the body and headers.
However, headers pose an issue when there are multiple headers with the same name.
As such we've left the static version of http
to not perform any serialization.
Build
npm install
npm run test
npm run test:watch
npm run lint
npm run build
npm run build-dev
npm run build-bundle
Migration from 2.x
There has been a complete overhaul of the codebase.
For notes about how to migrate coming from 2.x,
please see Migration from 2.x
Graveyard
For features known to be missing from 3.x please see the Graveyard