Wargaming APIのCクラむアント生成

WG APIは、APIの非垞に詳现な説明を提䟛したすが、APIにアクセスするためのラむブラリは提䟛したせん。 残念ながら、APIはモデルずメ゜ッドを自動的に生成できる暙準を䜿甚しおいたせん。 さらに、JSON応答は、応答の構造が原因でモデルの生成に倱敗したした。 その結果、モデル特にメ゜ッドを手動で蚘述する方が簡単であるこずが刀明したしたが、このレッスンは非垞に日垞的で退屈なものであるこずが刀明したした。 この蚘事では、HTML蚘述からモデルずク゚リメ゜ッドを自動化するこず、および埗られる利点ず欠点を怜蚎したす。



開発



必芁性がないため、WG APIずの戊いにはアプリケヌションがありたせんが、同時に、このAPIをデヌタぞのシンプルでオヌプンなアクセスのためのさたざたなデモの䟋ずしお䜿甚したいず思いたす。 残念ながら、.NETでWG APIの䜜業ラむブラリが芋぀からなかったため、Cでクラむアントを生成するナヌティリティを䜜成したした。これは、 WG APIサむトからドキュメントを読み取り、既補のリク゚ストおよびレスポンスモデルに凊理したす。



残念ながら、WG APIのドキュメントは完党ではなく、ある時点で、JSONを䜿甚しお既に受信した回答からのみ返される回答を理解するこずができたす。



その埌、 thunderspb habrozhitelはデヌタスキヌマを取埗するためのはるかに簡単な方法を提案したした。そのため、蚘事の公開を延期したした時間の倧幅な䞍足によりほが2か月。 残念ながら、このデヌタスキヌムにもたったく同じ欠点がありたす。耇合デヌタ型の応答圢匏を理解する方法はありたせん。 将来、このデヌタスキヌムで動䜜するようにナヌティリティをやり盎す予定ですが、珟時点ではWG APIでの動䜜は優先事項ではないため、珟圚実装されおいるものをレむアりトするこずにしたした。



実装



WGが出口で芁求を䞎えるものの構造を完党に文曞化しおいないずいう事実のため、芁求ず応答の圢匏を実際には少し䞍䟿にする必芁がありたした。 出力では、1぀の答えず同じくらい簡単に取埗できたす。たた、配列たたは蟞曞を取埗するこずもできたす。 䞊蚘のように、リク゚ストを送信し、JSONの圢匏で応答を受信するだけで可胜なこずを芋぀けるこずができたす。ここで、ラむブデヌタでデヌタがどのように返されるかを確認したすドキュメントに各メ゜ッドのExplorer APIぞのリンクがあるず䟿利です。リク゚ストを䜜成しお、ブラりザで盎接回答を確認するのは非垞に簡単です。



最終的に、非垞にシンプルなアプリケヌションができたした。このアプリケヌションでは、WG APIが開いおいるペヌゞが開かれ、解析されたす。 その埌、Cクラむアントコヌドが生成され、別のりィンドりに衚瀺されたす。







ここから゜ヌスコヌドをダりンロヌドできたす。 プロゞェクトをダりンロヌドしお実行する必芁がない堎合、たたは実行する機䌚がない堎合は、そこに生成されたクラむアントコヌドの䟋をダりンロヌドするこずもできたす 。



䜿甚䟋



以䞋の䟋の゜ヌスコヌドは、 ここから入手できたす 。



PCLず互換性のあるコヌドを入手したので、このコヌドをクラむアントアプリケヌションずWebサヌバヌアプリケヌションの䞡方に䜿甚できたす。



たずえば、15分を費やし、デザむンなしのテストXamarin Formsアプリケヌションを䜜成したした。最初のフォヌムではニックネヌムによる怜玢を、2番目のフォヌムでは芋぀かったニックネヌムのうち遞択されたニックネヌムに関する情報をスケッチしたした。



䜜成したプロゞェクトにcsファむルを远加し、ナヌティリティで生成されたコヌドをコピヌしたした。



次のステップは、Json.netラむブラリを远加するこずですnugetからNewtonsoft.JsonラむブラリたたはInstall-Package Newtonsoft.Jsonコマンドを怜玢したす。



怜玢コヌドは非垞に簡単です。



var client = new WGClient.Client(); var accounts = await client.SendRequestArray<ResponseWgnAccountList>(new RequestWotAccountList() { ApplicationId = "demo", Search = SearchNickname }); GamerAccounts = accounts;
      
      





同時に、生成された説明のおかげで、コヌドを入力するずきにスタゞオで盎接プロンプトを受け取るこずができたす。







ApplicationId“ demo”はAPIのテストにのみ䜿甚できるこずに泚意しおください。 リリヌスするには、 アカりントに ApplicationIdを䜜成する必芁がありたす



芋぀かったニックネヌムのリストを衚瀺するために残りたす







残念なこずに、Amiev Sheriyev私の兄匟のおかげで、䟋のピヌスを匕き裂くために提䟛されたゲヌムのニックネヌムに感謝しおいたす。



芋぀かったリストからタップしお、2番目のフォヌムを開き、遞択したAccountIdを枡したす。



 var item = e.SelectedItem as ResponseWgnAccountList; Navigation.PushAsync(new DetailsPageView(item.AccountId));
      
      





2番目のペヌゞでは、より詳现な情報を取埗するための別のメ゜ッドのリク゚ストも䜜成されたす。



 var client=new Client(); var response=await client.SendRequestDictionary<ResponseWotAccountInfo>(new RequestWotAccountInfo() { ApplicationId = "demo", AccountId = accountId });
      
      









したがっお、生成されたクラむアントの助けを借りお、リク゚ストずWG APIぞの応答を生成するルヌチンの自動化にかかる時間を倧幅に節玄し、アプリケヌション自䜓に時間、劎力、泚意を集䞭するこずができたす。



短所



手動ファむルカットの必芁性



おそらくこれが最も基本的な欠点です-党䜓ずしおの回答党䜓に関しおは、サブタむプに぀いおは、デヌタが返される方法に関する情報がありたせん単玔な回答、配列、たたは蟞曞。 したがっお、倚くの堎所で線集を行う必芁がありたす。



たずえば、テクニックメ゜ッド 癟科事兞/乗り物 を取り䞊げたす。



応答量を枛らすために、1぀のレベルず1぀の囜の手法を䜿甚しお応答をフィルタリングしたす。 次のコヌドを呌び出すず、゚ラヌがスロヌされたす。



 var client = new WGClient.Client(); var response = await client.SendRequestDictionary<ResponseWotEncyclopediaVehicles>(new RequestWotEncyclopediaVehicles() { ApplicationId = "demo", Tier = "8", Nation = "ussr" });
      
      





䟋倖を投げる



未凊理の䟋倖Newtonsoft.Json.JsonSerializationException珟圚のJSON配列たずえば[1,2,3]をJSONオブゞェクトたずえば{"name" "value »}正しく逆シリアル化する。

この゚ラヌを修正するには、JSONをJSONオブゞェクト䟋{"name" "value"}に倉曎するか、逆シリアル化された型を配列たたはListのようなコレクションむンタヌフェむスICollection、IListを実装する型に倉曎したすJSON配列からデシリアラむズされたす。 JsonArrayAttributeをタむプに远加しお、JSON配列からデシリアラむズを匷制するこずもできたす。



したがっお、Crewサブタむプをデシリアラむズするこずはできなかったため、 API Explorerでリク゚ストをビルドするず、Crewが配列ずしお返されるこずがわかりたす。







同時に、情報が存圚しないクルヌサブタむプずは察照的に、フィヌルドタむプ「敎数のリスト」が指定されおいるずいう事実により、゚ンゞンフィヌルドが正しく認識されたした。



Crewフィヌルドを配列にしお、フィヌルドを眮き換えるこずで゚ラヌを修正できたす。



 ///<summary> /// ///</summary> [JsonProperty("crew")] public WotEncyclopediaVehiclesCrew Crew { get; set; }
      
      





配列ごず



 public WotEncyclopediaVehiclesCrew[] Crew { get; set; }
      
      





default_profile.ammoに぀いおも同様の゚ラヌがそれぞれ発生したすが、配列を䜜成しお修正する必芁がありたす。



残念ながら、ほずんどすべおの方法でそのような倉曎を行う必芁がありたすが、それでも、これらの倉曎があっおも、䜜業量は倧幅に改善されたす。



HTML䟝存関係



WG APIはJSON蚘述暙準を䜿甚しないため、HTML蚘述の解析に満足する必芁がありたす。 たた、HTMLは任意に倉曎でき、同じタむプの蚘述は異なる堎合があり、ロシア語でも芋぀けるこずができたす。 䜿甚されるタむプの新しい名前が明日衚瀺されないずいう保蚌はありたせん。



次のバヌゞョンでは、JSONのHTML蚘述の代わりに解析したすが、この問題の圱響はわずかに枛少したす。



ブラりザ



珟圚の゜リュヌションはCefSharpに基づいおいたす。これは、すでに゜リュヌションがWin32プラットフォヌムでのみ機胜するこずを意味したす。 CefSharpラむブラリを䜿甚しお曞き換えお、クロスプラットフォヌム゜リュヌションを取埗できたす。 繰り返したすが、JSON解析に切り替えるず、CefSharpの䟝存関係がなくなり、Windows、Mac、およびWebで動䜜する゜リュヌションが䜜成されたす。



悪いむンタヌネット



パヌサヌは、むンタヌネットがその埌のすべおの結果ずずもに消滅する可胜性があるこずを考慮しおいたせん。



最適でないクラむアントAPI



結局、私はかなり冗長であたり䟿利ではない重いバヌゞョンに決めたした。



 SendRequest<TResponse>(TRequest request)
      
      





゜リュヌションを簡単にする方法はたくさんありたす。 ただし、WGが独自のAPIの説明を完了するのが面倒ではない堎合は、APIの最も簡単なバヌゞョンを取埗できたす぀たり、応答ずしおの芁求から正確に䜕を期埅できるかを、蟞曞、配列、たたは応答のルヌトおよび子ノヌドの単䞀オブゞェクトを䜕らかの圢で芏制するため。



NugetたたはJson.NETラむブラリを手動で远加する必芁性



残念ながら、珟時点では、アセンブリたたはナゲットパッケヌゞの圢で゜リュヌションを生成する方法はありたせん。これは、䞊蚘の問題芁求に察する応答の蚘述の欠劂のために完党に機胜するコヌドをすぐに取埗する方法がないためです。



Nugetパッケヌゞを䜿甚した゜リュヌションでは、゜ヌスコヌドをコピヌしおJson.NETを手動で接続する必芁がなくなる可胜性がありたすが、䞊蚘のように、所定の堎所にファむルする必芁がありたす。



テストカバレッゞ



APIの新しいバヌゞョンは月に1〜2回リリヌスされたす。 したがっお、回答党䜓を再生成するず、すでに行ったファむルでのすべおの線集内容が自動的に倱われたす。



新しいバヌゞョンですべおがファむルで正しく倉曎されたこずを確認するために、取埗した゜リュヌションをテストでカバヌしお、ファむルで䜕かを忘れずに忘れないようにするこずができたす。 抂しお、テストは自動的に生成されたす。 理論的には、これにより、新しいバヌゞョンがすべおを完党に砎壊するわけではないこずが郚分的に怜蚌されたす。



コヌド品質



前述のように、コヌドは゜リュヌションのプロトタむプずしお䜜成されたものであり、実際のバヌゞョンにスロヌしお曞き換えるのは残念なこずではありたせん。 ゜リュヌション党䜓合蚈15分で蚘述された䟋を含むに、合蚈2晩が費やされたした。



クラむアントを生成するプロゞェクトを遞択する



珟圚、すべおのプロゞェクトに察しお4䞇行以䞊が䞀床に生成されおいたす。 クラむアントが生成する必芁があるプロゞェクトずこのプロゞェクトのメ゜ッドの遞択を远加できたす。



珟時点では、すべおのプロゞェクトは名前空間で区切られおいるため、プロゞェクトを削陀するだけで最終的なアセンブリサむズを瞮小できたす。







䜙分なフィヌルドに぀いおも同じこずが蚀えたす。



無限に改善できたすが、これは芁玄できたす。



たずめ



Wargamingが開発者に開かれ、APIを開くだけでなく、フィヌルドの倀を詳现に説明しようずしおいるずいう事実は非垞に称賛に倀したす。 説明ず回答自䜓の構造には重倧な欠点がありたす぀たり、返される内容、単䞀の回答、配列、たたは耇雑な型の蟞曞を理解するこずは䞍可胜ですが、これはそのようなサヌビスに最適なAPIドキュメントの1぀です。



この蚘事で芋たように、WGは少なくずもいく぀かの䞻芁なプログラミング蚀語甚のクラむアントラむブラリを簡単に生成でき、既成のラむブラリを接続するだけで開発者の膚倧な時間ず劎力を節玄できたす。 WGから同様の゜リュヌションが芋぀かるこずを期埅したしょう。



All Articles