WebAPI設計のポイント
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「...
-[[戻る>アプリケーション設計のポイント]]
*目次 [#l07a868e]
#contents
*概要 [#oc157d98]
「[[通信制御機能]]」開発の試行錯誤を纏めておく。
-「[[通信制御機能]]」で最も成功したのは、.NETオブジェクト...
[[インターフェイスの汎用性>#f7d9c2da]]の高いWebAPIである。
--これが実現できたのは、.NETのBinarySerializer が強力だっ...
例えば、C言語の構造体表現という方法もあるが、これでは、~
ネイティブ・オブジェクト表現へのパースが難しくなってしま...
--この場合、下位のプロトコルはなんでも良い。何を使用して...
--問題があるとすれば、[[通信の相互運用性>#e3ce4135]]が無...
-次に成功するだろうと思われるのは、REST JSON、JSON-RPCの...
--共通層を経由してB層・D層にアクセスできる点を除いて特に...
--個別インターフェイス上で特定の型にパースすれば、~
共通層ではベースの型やobject型を使用して、個別処理にデー...
--これにより、[[インターフェイスの汎用性>#f7d9c2da]]、[[...
個別インターフェイスの定義と、個別インターフェイス上で特...
**トレード・オフ [#g55a4ddc]
ソレ以外の方式には、
-[[インターフェイスの汎用性>#f7d9c2da]]
-[[通信の相互運用性>#e3ce4135]]
の問題が有り、使い難い。
**サマリ(評価) [#vfa9f581]
通信方式は、以下のように評価できる。
|#|評価項目|バイナリ転送|SOAP|JSON|h
|1|[[インターフェイスの汎用性>#f7d9c2da]]|高|基本的には「...
|2|[[通信の相互運用性>#e3ce4135]]|低|基本的には「中」程度...
|3|インターフェイス定義|オブジェクト型&br;任意のバインデ...
*ポイント [#ic1ef259]
**インターフェイスの汎用性 [#f7d9c2da]
***要素 [#reea05d2]
-WebAPIはなるべく汎用的に定義したい(インターフェイス定義...
-この場合、インターフェイス記述、データ記述言語は1つだが...
-何かをキーにして、中を通るデータをパースする先の型が明確...
インターフェイス記述、データ記述言語の次の段階のobjectの...
そもそも、汎用性を追求してしまうと、[[通信の相互運用性>#e...
***例 [#e0488a61]
-.NETオブジェクトのバイナリ転送がまさにこれに該当する([[...
-任意のバインディング(SOAPやXML/JSON)でも可能だが[[通信...
**通信の相互運用性 [#e3ce4135]
SOAPやXML/JSONなどは通信の相互運用性がある~
(≒異なるテクノロジ間をブリッジできる)~
インターフェイス記述、データ記述言語であると言える。
***データ・フォーマット [#c6b16bd8]
-異なるテクノロジ間で通信の相互運用性を高めるには、~
データ記述言語でデータ・フォーマットが標準化されている必...
-[[インターフェイスの汎用性>#f7d9c2da]]を高めるために、さ...
データ・フォーマット(objectの階層構造やbinary表現)を規...
これは=言語レベルの話になることが多く、相互運用に問題を...
***パーサー [#cd5d93a3]
また、各言語向けのパーサーが拡充してくる必要がある。~
SOAPやXML/JSONなど、標準化されているため各言語向けのパー...
***例 [#tb303f1f]
-SOAP
--インターフェイス記述言語はWSDL、データ記述言語はXML。
--サーバーがWSDLを生成し、クライアントはWDSLを理解してプ...
--これで相互運用は可能だが、ライブラリがスクリプト言語に...
--このため、最近では、SOAPより、JSONを使用することが多く...
-XML
--インターフェイス記述言語は無く、データ記述言語としてXML...
--XMLパーサーが必要だが、JavaScriptなどのスクリプト言語に...
--JSONと同じく、REST APIを開発可能であったが、JSONのREST...
-JSON
--インターフェイス記述言語は無く、データ記述言語としてJSO...
--各言語間でBean(POJO/POCO)、Genericのパースが同じフォ...
--特にJSONは仕組みが簡単なため、スクリプト言語含めて相互...
*技術的課題 [#z3008006]
**[[WCF>https://techinfoofmicrosofttech.osscons.jp/index....
***概要 [#da22110b]
-ABCを選択可能にするという野心的な試み。
--A:アドレス
--B:バインディング(トランスポート・プロトコル、エンコー...
--C:コントラクト
---サービス・コントラクト
---オペレーション・コントラクト
---データ・コントラクト
-ただ、トレードオフがあって結局の所、良い所取りが出来ない...
バイナリ転送(汎用性の重視)か、SOAPやJSON(相互運用性の...
-例えば、WCFのデータコントラクトは、
--オブジェクト表現でデータコントラクトを行うため、そもそ...
--このため、通信の相互運用性の低いバイナリ転送や、SOAPに...
--この中で、SOAPは、唯一、相互運用が可能なバインディング...
--しかし、XML/JSONなど、高い通信の相互運用性を目的とした...
***バイナリ転送や、SOAP [#x8c3fd2a]
バイナリ転送や、SOAPはあまり通信の相互運用性を気にする必...
-WCFのTCP/IP(バイナリ・データなので相互運用することが少...
-WCFのSOAP(WSDLで相互運用が保証されている。)
***XML/JSON [#k2bacbc6]
-しかし、XML/JSONについては、データコントラクトはミスマッチ
-理由は、データコントラクトを交換できるということは、
--objectの階層構造やbinary表現が一致しているか、
--WSDLのような、インターフェイス記述言語が必要だった。
-このため、初期のパーサーは通信の相互運用性が殆ど考えられ...
--このため、XML/JSONなどのRESTfulなAPIを定義するには、~
データコントラクトを使用するWCFは向いていなかった。
--しかし、中期以降は、特にパースの仕様が言語を跨いで標準...
データコントラクト無しでデータの送受信が可能になった。
***分析 [#t86a8bd1]
-インターフェイス記述やデータ記述言語を重視すると、
--相互運用性は高まるが、
--複雑なオブジェクトを汎用的にパースする処理の実装は難し...
-データコントラクトを重視すると、
--汎用性は高まるが、
--問題をインターフェイス記述やデータ記述言語に~
移動させているだけなので、相互運用性が犠牲になる。
**[[汎用DTO]] [#ffa6d900]
***概要 [#ka1d94d3]
-DataTableを異なるランタイム間で交換できるようにするため...
-具体的には、.NET FrameworkとSilverlight間でDataTableを交...
-ランタイムが異なっても、objectの階層構造を維持してデータ...
***パーサーの問題 [#n16e3792]
-しかし、実装量が多く、パーサーを各言語に向けて提供するの...
-DataTableはBean(POJO/POCO)、Genericと比べて廃れた感が...
複雑なデータアクセスをするエンタープライズ・システムでは...
このため、各言語に向けてパーサーが提供されればイイ気もす...
(これは、エンタープライズ・システムを実装する言語が限ら...
***今後の展望 [#eef1812d]
-.NET FrameworkとSilverlightに替り.NET Core間のデータ転送...
-しかし、.NET Standard2.0からは、DataTableが供給されてい...
このため、XmlSerializerを使用すれば、.NET Frameworkと.NET...
データ交換ができるようになるかもしれない。
**JSON [#f75d43fc]
JSONにもトレードオフがある。
***インターフェイスの汎用性 [#e7bb0652]
インターフェイスを汎用的にする場合、
-二次元表など、構造が決まっているモノに関しては、~
List<Dictionary<string, string>>などのGenericを使用できる。
-構造が決まっていないモノに関しては、object型を使用できる...
JSON.NETではJObjectが返るため、手動パースが必要になってし...
***通信の相互運用性 [#n50e2c18]
-JSONには、インターフェイス記述言語は無いが、~
Bean(POJO/POCO)やGenericのパースの仕様が言語を跨いで標...
Bean(POJO/POCO)やGenericで構築したobjectの階層構造が≒イ...
-このため、通信の相互運用性を高めるには、~
Bean(POJO/POCO)やGenericで≒インターフェイス定義するとイ...
**OpenAPI / Swagger [#pc33d888]
REST 用のインターフェイス記述言語っぽいが、多分、流行らな...
-Swagger (OpenAPI) - マイクロソフト系技術情報 Wiki~
https://techinfoofmicrosofttech.osscons.jp/index.php?Swag...
*参考 [#g7f91197]
**[[Webサービス]] [#he20cf95]
**[[認証基盤>汎用認証サイト(Multi-purpose Authentication...
終了行:
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「...
-[[戻る>アプリケーション設計のポイント]]
*目次 [#l07a868e]
#contents
*概要 [#oc157d98]
「[[通信制御機能]]」開発の試行錯誤を纏めておく。
-「[[通信制御機能]]」で最も成功したのは、.NETオブジェクト...
[[インターフェイスの汎用性>#f7d9c2da]]の高いWebAPIである。
--これが実現できたのは、.NETのBinarySerializer が強力だっ...
例えば、C言語の構造体表現という方法もあるが、これでは、~
ネイティブ・オブジェクト表現へのパースが難しくなってしま...
--この場合、下位のプロトコルはなんでも良い。何を使用して...
--問題があるとすれば、[[通信の相互運用性>#e3ce4135]]が無...
-次に成功するだろうと思われるのは、REST JSON、JSON-RPCの...
--共通層を経由してB層・D層にアクセスできる点を除いて特に...
--個別インターフェイス上で特定の型にパースすれば、~
共通層ではベースの型やobject型を使用して、個別処理にデー...
--これにより、[[インターフェイスの汎用性>#f7d9c2da]]、[[...
個別インターフェイスの定義と、個別インターフェイス上で特...
**トレード・オフ [#g55a4ddc]
ソレ以外の方式には、
-[[インターフェイスの汎用性>#f7d9c2da]]
-[[通信の相互運用性>#e3ce4135]]
の問題が有り、使い難い。
**サマリ(評価) [#vfa9f581]
通信方式は、以下のように評価できる。
|#|評価項目|バイナリ転送|SOAP|JSON|h
|1|[[インターフェイスの汎用性>#f7d9c2da]]|高|基本的には「...
|2|[[通信の相互運用性>#e3ce4135]]|低|基本的には「中」程度...
|3|インターフェイス定義|オブジェクト型&br;任意のバインデ...
*ポイント [#ic1ef259]
**インターフェイスの汎用性 [#f7d9c2da]
***要素 [#reea05d2]
-WebAPIはなるべく汎用的に定義したい(インターフェイス定義...
-この場合、インターフェイス記述、データ記述言語は1つだが...
-何かをキーにして、中を通るデータをパースする先の型が明確...
インターフェイス記述、データ記述言語の次の段階のobjectの...
そもそも、汎用性を追求してしまうと、[[通信の相互運用性>#e...
***例 [#e0488a61]
-.NETオブジェクトのバイナリ転送がまさにこれに該当する([[...
-任意のバインディング(SOAPやXML/JSON)でも可能だが[[通信...
**通信の相互運用性 [#e3ce4135]
SOAPやXML/JSONなどは通信の相互運用性がある~
(≒異なるテクノロジ間をブリッジできる)~
インターフェイス記述、データ記述言語であると言える。
***データ・フォーマット [#c6b16bd8]
-異なるテクノロジ間で通信の相互運用性を高めるには、~
データ記述言語でデータ・フォーマットが標準化されている必...
-[[インターフェイスの汎用性>#f7d9c2da]]を高めるために、さ...
データ・フォーマット(objectの階層構造やbinary表現)を規...
これは=言語レベルの話になることが多く、相互運用に問題を...
***パーサー [#cd5d93a3]
また、各言語向けのパーサーが拡充してくる必要がある。~
SOAPやXML/JSONなど、標準化されているため各言語向けのパー...
***例 [#tb303f1f]
-SOAP
--インターフェイス記述言語はWSDL、データ記述言語はXML。
--サーバーがWSDLを生成し、クライアントはWDSLを理解してプ...
--これで相互運用は可能だが、ライブラリがスクリプト言語に...
--このため、最近では、SOAPより、JSONを使用することが多く...
-XML
--インターフェイス記述言語は無く、データ記述言語としてXML...
--XMLパーサーが必要だが、JavaScriptなどのスクリプト言語に...
--JSONと同じく、REST APIを開発可能であったが、JSONのREST...
-JSON
--インターフェイス記述言語は無く、データ記述言語としてJSO...
--各言語間でBean(POJO/POCO)、Genericのパースが同じフォ...
--特にJSONは仕組みが簡単なため、スクリプト言語含めて相互...
*技術的課題 [#z3008006]
**[[WCF>https://techinfoofmicrosofttech.osscons.jp/index....
***概要 [#da22110b]
-ABCを選択可能にするという野心的な試み。
--A:アドレス
--B:バインディング(トランスポート・プロトコル、エンコー...
--C:コントラクト
---サービス・コントラクト
---オペレーション・コントラクト
---データ・コントラクト
-ただ、トレードオフがあって結局の所、良い所取りが出来ない...
バイナリ転送(汎用性の重視)か、SOAPやJSON(相互運用性の...
-例えば、WCFのデータコントラクトは、
--オブジェクト表現でデータコントラクトを行うため、そもそ...
--このため、通信の相互運用性の低いバイナリ転送や、SOAPに...
--この中で、SOAPは、唯一、相互運用が可能なバインディング...
--しかし、XML/JSONなど、高い通信の相互運用性を目的とした...
***バイナリ転送や、SOAP [#x8c3fd2a]
バイナリ転送や、SOAPはあまり通信の相互運用性を気にする必...
-WCFのTCP/IP(バイナリ・データなので相互運用することが少...
-WCFのSOAP(WSDLで相互運用が保証されている。)
***XML/JSON [#k2bacbc6]
-しかし、XML/JSONについては、データコントラクトはミスマッチ
-理由は、データコントラクトを交換できるということは、
--objectの階層構造やbinary表現が一致しているか、
--WSDLのような、インターフェイス記述言語が必要だった。
-このため、初期のパーサーは通信の相互運用性が殆ど考えられ...
--このため、XML/JSONなどのRESTfulなAPIを定義するには、~
データコントラクトを使用するWCFは向いていなかった。
--しかし、中期以降は、特にパースの仕様が言語を跨いで標準...
データコントラクト無しでデータの送受信が可能になった。
***分析 [#t86a8bd1]
-インターフェイス記述やデータ記述言語を重視すると、
--相互運用性は高まるが、
--複雑なオブジェクトを汎用的にパースする処理の実装は難し...
-データコントラクトを重視すると、
--汎用性は高まるが、
--問題をインターフェイス記述やデータ記述言語に~
移動させているだけなので、相互運用性が犠牲になる。
**[[汎用DTO]] [#ffa6d900]
***概要 [#ka1d94d3]
-DataTableを異なるランタイム間で交換できるようにするため...
-具体的には、.NET FrameworkとSilverlight間でDataTableを交...
-ランタイムが異なっても、objectの階層構造を維持してデータ...
***パーサーの問題 [#n16e3792]
-しかし、実装量が多く、パーサーを各言語に向けて提供するの...
-DataTableはBean(POJO/POCO)、Genericと比べて廃れた感が...
複雑なデータアクセスをするエンタープライズ・システムでは...
このため、各言語に向けてパーサーが提供されればイイ気もす...
(これは、エンタープライズ・システムを実装する言語が限ら...
***今後の展望 [#eef1812d]
-.NET FrameworkとSilverlightに替り.NET Core間のデータ転送...
-しかし、.NET Standard2.0からは、DataTableが供給されてい...
このため、XmlSerializerを使用すれば、.NET Frameworkと.NET...
データ交換ができるようになるかもしれない。
**JSON [#f75d43fc]
JSONにもトレードオフがある。
***インターフェイスの汎用性 [#e7bb0652]
インターフェイスを汎用的にする場合、
-二次元表など、構造が決まっているモノに関しては、~
List<Dictionary<string, string>>などのGenericを使用できる。
-構造が決まっていないモノに関しては、object型を使用できる...
JSON.NETではJObjectが返るため、手動パースが必要になってし...
***通信の相互運用性 [#n50e2c18]
-JSONには、インターフェイス記述言語は無いが、~
Bean(POJO/POCO)やGenericのパースの仕様が言語を跨いで標...
Bean(POJO/POCO)やGenericで構築したobjectの階層構造が≒イ...
-このため、通信の相互運用性を高めるには、~
Bean(POJO/POCO)やGenericで≒インターフェイス定義するとイ...
**OpenAPI / Swagger [#pc33d888]
REST 用のインターフェイス記述言語っぽいが、多分、流行らな...
-Swagger (OpenAPI) - マイクロソフト系技術情報 Wiki~
https://techinfoofmicrosofttech.osscons.jp/index.php?Swag...
*参考 [#g7f91197]
**[[Webサービス]] [#he20cf95]
**[[認証基盤>汎用認証サイト(Multi-purpose Authentication...
ページ名: