投稿者

インターシステムズジャパン
記事 Toshihiko Minamoto · 10月 18, 2023 7m read

OpenAPI Suite - パート 2

コミュニティの皆さん、こんにちは。

パート 1 では、すべてのパッケージ、使用されているライブラリ、および REST サービスについて説明しました。

次は、コンバーターサービスとバリデーターサービスについて詳しく説明したいと思います。

OpenAPI-Suite はデフォルトで、仕様バージョンが 3.0 未満である場合に HTTP リクエストを converter.swagger.io に送信し、別の HTTP リクエストを validator.swagger.io に送信して仕様ドキュメントの構造を単純化します。  

オンラインユーティリティの使用は便利ではありますが、場合によっては独自のコンバーターとバリデーターのインスタンスを使用する方が便利な場合もあります。  たとえば、OpenAPI-Suite が ObjectScript 開発者向けに組織のサーバーに提供されている場合、外部サービスへのリクエストを回避する方が好ましいことがあります(プライバシーやリクエストレートの制限を回避するため)。 

以下を実行してください。 

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
ブラウザで http://localhost:8085/ と http://localhost:8086/ を開くと、これらのサービスの UI にアクセスできます。  

ローカルサービスを使用するために OpenAPI-Suite を構成する必要があるため、IRIS ターミナルを開いて、以下のグローバルを設定します。

^swaggervalidator("ValidatorURL")="http://"^swaggervalidator("Port")=^swaggerconverter("ConverterURL")="http://"^swaggerconverter("Port")=

では、これを Docker-Compose に統合して、自動的に行う方法を見てみましょう。

まず、post-start スクリプト(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 0

このスクリプトは iris-main プログラムによって実行されます。  スクリプトに「execute」権限があることを確認してください(chmod +x init_openapisuite.sh)。  

次に、以下のように docker-compose ファイルを作成します。

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:8080

すべてのリソースはこちらのリポジトリにあります。すでにクローンした場合は、「git pull」を実行して最新のアップデートを取得してください。  すると、以下のコマンドを使って、すべてのサービスとともに OpenAPI-Suite をローカルで起動できます。 

docker-compose --file docker-compose-with-swagger.yml up -d; or for compose plugin users; docker compose --file docker-compose-with-swagger.yml up -d

 

これは単なる 1 つのアイデアに過ぎませんが、OpenAPI-Suite 実装が十分に完全になれば、おそらく Swagger 3.0 のオンライン ObjectScript コード生成サービスを提供するために使用できるようになる可能性があります。  現時点では、アプリケーションは dc demo server にホストされているため、openapi-suite 用の小さなクライアントを作るアイデアを得ました(これも openapi-suite 自体で生成されたものです! ).  つまり、すべてのツールをローカルにインストールしなくても、リモートコード生成を利用することが可能です。

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)
 
ターミナルの出力
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>

<p>
   
</p>

お読みいただきありがとうございました!