OpenAPI Suite - Partie 2
Bonjour à la communauté,
Dans la première partie, nous avons décrit tous les packages, les bibliothèques utilisées et les services REST. J'aimerais maintenant détailler un peu plus les services convertisseur et validateur. Par défaut, OpenAPI-Suite envoie une requête HTTP converter.swagger.io si a spécification est de version inférieure à 3.0 et une autre requête HTTP à validator.swagger.io pour simplifier la structure de la spécification.
Bien que l'utilisation d'utilitaires en ligne soit pratique, dans certains cas, nous pourrions préférer avoir notre propre instance du convertisseur et du validateur. Par exemple, si OpenAPI-Suite est mis à disposition sur un serveur dans une organisation pour les développeurs ObjectScript, il peut être préférable d'éviter les requêtes vers les services externes (confidentialité, éviter les limites de taux de demande,...). Ceux-ci sont disponibles en images Docker, il suffit d'exécuter :
docker run -d -p 8085:8080 --name swagger-converter swaggerapi/swagger-converter:latest
docker run -d -p 8086:8080 --name swagger-validator-v2 swaggerapi/swagger-validator-v2:latest
Ouvrez votre navigateur aux l'URL http://localhost:8085/ et http://localhost:8086/ et vous avez accès à l'interface utilisateur de ces services.
OpenAPI-Suite doit ensuite être configuré pour utiliser les services locaux au lieu des services REST publics, pour cela ouvrez un terminal IRIS et définissez les paramètres suivants:
Set^swaggervalidator("ValidatorURL")="http://<hostname>"Set^swaggervalidator("Port")=<port>
Set^swaggerconverter("ConverterURL")="http://<hostname>"Set^swaggerconverter("Port")=<port>Voyons maintenant comment intégrer cela dans un fichier docker-compose et le faire automatiquement.
Tout d'abord, nous préparons un script post-start script(nommé init_openapisuite.sh) :
#!/bin/bash
openapi_suite() {
iris session $ISC_PACKAGE_INSTANCENAME -U IRISAPP <<- END
Set^swaggerconverter("ConverterURL") = "${CONVERTER_URL:-converter.swagger.io}"Set^swaggerconverter("Port") = "${CONVERTER_PORT:-80}"Set^swaggervalidator("ValidatorURL") = "${VALIDATOR_URL:-validator.swagger.io}"Set^swaggervalidator("Port") = "${VALIDATOR_PORT:-80}"Halt
END
}
openapi_suite
exit 0Ce script sera exécuté par le programme iris-main program. Vérifiez que le script a les droits "execute" (chmod +x init_openapisuite.sh).
Ensuite, nous pouvons créer un fichier docker-compose comme ceci :
version: '3.6'
services:
iris:
build:
context: .
dockerfile: Dockerfile
restart: always
command: --check-caps false --ISCAgent false -a /home/irisowner/irisdev/init_openapisuite.sh
environment:
- CONVERTER_URL=http://swagger-converter
- CONVERTER_PORT=8080
- VALIDATOR_URL=http://swagger-validator-v2
- VALIDATOR_PORT=8080
ports:
- 1972
- 52796:52773
- 53773
volumes:
- ./:/home/irisowner/irisdev
swagger-converter:
image: swaggerapi/swagger-converter:latest
restart: always
# optional, openapi-suite don't need port exposed
ports:
- 8085:8080
swagger-validator-v2:
image: swaggerapi/swagger-validator-v2:latest
restart: always
# optional, openapi-suite don't need port exposed
ports:
- 8086:8080Toutes les ressources sont disponibles dans ce repository GitHub, si vous l'avez déjà cloné, faites simplement un "git pull" pour obtenir les dernières mises à jour. Ensuite, vous pouvez démarrer OpenAPI-Suite avec tous les services avec la commande suivante :
docker-compose --file docker-compose-with-swagger.yml up -d; or for compose plugin users; docker compose --file docker-compose-with-swagger.yml up -dCe n'est qu'une idée, mais si le développement d'OpenAPI-Suite devient suffisamment complet, l'application pourrait être utilisée pour offrir des services de génération de code ObjectScript en ligne. Actuellement, l'application est hébergée sur le dc demo server, cela qui m'a donné l'idée de faire un petit client pour openapi-suite(généré par openapi-suite lui-même !). Il est donc possible de bénéficier de la génération de code à distance sans avoir à installer tous les outils localement:
zpm "install openapi-suite-client"
; remote openapi-suite REST service url : Set server = "https://openapisuite.demo.community.intersystems.com/openapisuite"; Specification could be an URL, filepath or a stream.Set specification = "https://petstore3.swagger.io/api/v3/openapi.json"; Package name for generated classes.Set packageName = "petstoreclient"; available type : ; - "client" : to generate http client classes. ; - "production" : to generate production client classes.; - "rest" : to generate REST server classesSet type = "client"; Request and Install the generated code.Set sc = ##class(dc.openapi.suite.client.RemoteCodeGen).Generate(specification, packageName, type, server)Terminal output
IRISAPP>Set sc = ##class(dc.openapi.suite.client.RemoteCodeGen).Generate(specification, packageName, type, server)
Load started on 02/06/202320:49:19
Loading file /usr/irissys/mgr/Temp/Lgm86wQGGdNSiQ.xml as xml
Imported class: petstoreclient.HttpClient
Imported class: petstoreclient.model.Address
Imported class: petstoreclient.model.ApiResponse
Imported class: petstoreclient.model.Category
Imported class: petstoreclient.model.Customer
Imported class: petstoreclient.model.Order
Imported class: petstoreclient.model.Pet
Imported class: petstoreclient.model.Tag
Imported class: petstoreclient.model.User
Imported class: petstoreclient.model.spec
Imported class: petstoreclient.requests.addPet
Imported class: petstoreclient.requests.createUser
Imported class: petstoreclient.requests.createUsersWithListInput
Imported class: petstoreclient.requests.deleteOrder
Imported class: petstoreclient.requests.deletePet
Imported class: petstoreclient.requests.deleteUser
Imported class: petstoreclient.requests.findPetsByStatus
Imported class: petstoreclient.requests.findPetsByTags
Imported class: petstoreclient.requests.getInventory
Imported class: petstoreclient.requests.getOrderById
Imported class: petstoreclient.requests.getPetById
Imported class: petstoreclient.requests.getUserByName
Imported class: petstoreclient.requests.loginUser
Imported class: petstoreclient.requests.logoutUser
Imported class: petstoreclient.requests.placeOrder
Imported class: petstoreclient.requests.updatePet
Imported class: petstoreclient.requests.updatePetWithForm
Imported class: petstoreclient.requests.updateUser
Imported class: petstoreclient.requests.uploadFile
Imported class: petstoreclient.responses.GenericResponse
Imported class: petstoreclient.responses.addPet
Imported class: petstoreclient.responses.createUser
Imported class: petstoreclient.responses.createUsersWithListInput
Imported class: petstoreclient.responses.deleteOrder
Imported class: petstoreclient.responses.deletePet
Imported class: petstoreclient.responses.deleteUser
Imported class: petstoreclient.responses.findPetsByStatus
Imported class: petstoreclient.responses.findPetsByTags
Imported class: petstoreclient.responses.getInventory
Imported class: petstoreclient.responses.getOrderById
Imported class: petstoreclient.responses.getPetById
Imported class: petstoreclient.responses.getUserByName
Imported class: petstoreclient.responses.loginUser
Imported class: petstoreclient.responses.logoutUser
Imported class: petstoreclient.responses.placeOrder
Imported class: petstoreclient.responses.updatePet
Imported class: petstoreclient.responses.updatePetWithForm
Imported class: petstoreclient.responses.updateUser
Imported class: petstoreclient.responses.uploadFile
Compiling 49 classes
Compiling class petstoreclient.HttpClient
Compiling class petstoreclient.model.Address
Compiling class petstoreclient.model.Category
Compiling class petstoreclient.model.ApiResponse
Compiling class petstoreclient.model.Customer
Compiling class petstoreclient.model.Order
Compiling class petstoreclient.model.Tag
Compiling class petstoreclient.model.Pet
Compiling class petstoreclient.model.spec
Compiling class petstoreclient.requests.addPet
Compiling class petstoreclient.model.User
Compiling class petstoreclient.requests.createUser
Compiling class petstoreclient.requests.deleteOrder
Compiling class petstoreclient.requests.createUsersWithListInput
Compiling class petstoreclient.requests.deleteUser
Compiling class petstoreclient.requests.deletePet
Compiling class petstoreclient.requests.findPetsByStatus
Compiling class petstoreclient.requests.findPetsByTags
Compiling class petstoreclient.requests.getInventory
Compiling class petstoreclient.requests.getOrderById
Compiling class petstoreclient.requests.getPetById
Compiling class petstoreclient.requests.getUserByName
Compiling class petstoreclient.requests.loginUser
Compiling class petstoreclient.requests.logoutUser
Compiling class petstoreclient.requests.updatePet
Compiling class petstoreclient.requests.placeOrder
Compiling class petstoreclient.requests.updateUser
Compiling class petstoreclient.requests.updatePetWithForm
Compiling class petstoreclient.requests.uploadFile
Compiling class petstoreclient.responses.GenericResponse
Compiling class petstoreclient.responses.createUser
Compiling class petstoreclient.responses.addPet
Compiling class petstoreclient.responses.deleteOrder
Compiling class petstoreclient.responses.createUsersWithListInput
Compiling class petstoreclient.responses.deletePet
Compiling class petstoreclient.responses.deleteUser
Compiling class petstoreclient.responses.findPetsByTags
Compiling class petstoreclient.responses.findPetsByStatus
Compiling class petstoreclient.responses.getOrderById
Compiling class petstoreclient.responses.getInventory
Compiling class petstoreclient.responses.getPetById
Compiling class petstoreclient.responses.getUserByName
Compiling class petstoreclient.responses.logoutUser
Compiling class petstoreclient.responses.loginUser
Compiling class petstoreclient.responses.placeOrder
Compiling class petstoreclient.responses.updatePet
Compiling class petstoreclient.responses.updatePetWithForm
Compiling class petstoreclient.responses.updateUser
Compiling class petstoreclient.responses.uploadFile
Compiling routine petstoreclient.HttpClient.1
Compiling routine petstoreclient.model.Address.1
Compiling routine petstoreclient.model.ApiResponse.1
Compiling routine petstoreclient.model.Category.1
Compiling routine petstoreclient.model.Customer.1
Compiling routine petstoreclient.model.Order.1
Compiling routine petstoreclient.model.Tag.1
Compiling routine petstoreclient.model.Pet.1
Compiling routine petstoreclient.requests.addPet.1
Compiling routine petstoreclient.model.User.1
Compiling routine petstoreclient.requests.createUser.1
Compiling routine petstoreclient.requests.createUsersWithListInput.1
Compiling routine petstoreclient.requests.deleteOrder.1
Compiling routine petstoreclient.requests.deletePet.1
Compiling routine petstoreclient.requests.deleteUser.1
Compiling routine petstoreclient.requests.findPetsByStatus.1
Compiling routine petstoreclient.requests.getInventory.1
Compiling routine petstoreclient.requests.findPetsByTags.1
Compiling routine petstoreclient.requests.getOrderById.1
Compiling routine petstoreclient.requests.getPetById.1
Compiling routine petstoreclient.requests.getUserByName.1
Compiling routine petstoreclient.requests.loginUser.1
Compiling routine petstoreclient.requests.logoutUser.1
Compiling routine petstoreclient.requests.placeOrder.1
Compiling routine petstoreclient.requests.updatePet.1
Compiling routine petstoreclient.requests.updatePetWithForm.1
Compiling routine petstoreclient.requests.updateUser.1
Compiling routine petstoreclient.requests.uploadFile.1
Compiling routine petstoreclient.responses.GenericResponse.1
Compiling routine petstoreclient.responses.addPet.1
Compiling routine petstoreclient.responses.createUser.1
Compiling routine petstoreclient.responses.deleteOrder.1
Compiling routine petstoreclient.responses.createUsersWithListInput.1
Compiling routine petstoreclient.responses.deletePet.1
Compiling routine petstoreclient.responses.deleteUser.1
Compiling routine petstoreclient.responses.findPetsByTags.1
Compiling routine petstoreclient.responses.findPetsByStatus.1
Compiling routine petstoreclient.responses.getInventory.1
Compiling routine petstoreclient.responses.getOrderById.1
Compiling routine petstoreclient.responses.getPetById.1
Compiling routine petstoreclient.responses.loginUser.1
Compiling routine petstoreclient.responses.getUserByName.1
Compiling routine petstoreclient.responses.logoutUser.1
Compiling routine petstoreclient.responses.updatePet.1
Compiling routine petstoreclient.responses.placeOrder.1
Compiling routine petstoreclient.responses.updatePetWithForm.1
Compiling routine petstoreclient.responses.updateUser.1
Compiling routine petstoreclient.responses.uploadFile.1
Load finished successfully.
IRISAPP>
Merci!