前提
・WPFアプリ
・Visual Studio
・C#
お聞きしたいこと
API通信処理を記述しているのですが、
・非同期通信とその際のコールバック実装てこれでいいの?
と悩んでおり、アドバイス等頂ければ幸いです。
→ 実装済みで期待通りの動作はしています。
ただ、C#の経験が浅くまたデスクトップアプリを作成するのが初めてなので、自分以外の人が見て、このコードだと潜在的に○○な問題を孕んでいる、とかここはこういう書き方したほうが効率的だよ、といった意見があればお聞きしたいです。
コード
以下がPostの非同期通信処理メソッド、ログインAPIを叩くメソッドのコードです。
両方ともAPIManagerという通信処理関連のメソッドをまとめたクラスにて記述しており、ここのメソッドを他のクラスで使用する想定です。
↓Post通信を非同期で行うメソッドです。
・通信の汎用メソッドとして使用
・成功したらJTokenを返す
・通信エラーなら"error"という文字列を返す
・レスポンスが200以外なら"fail"とい文字列を返す
public static async Task<JToken> RequestPostAsync(string url, Dictionary<string, object> contentData) { var contentJson = Newtonsoft.Json.JsonConvert.SerializeObject(contentData); HttpContent content = new StringContent(contentJson); content.Headers.Add("hoge", "hoge"); content.Headers.Add("fuga", "fuga"); // 非同期処理実行 using (HttpClient client = new HttpClient(new WebRequestHandler { CachePolicy = new System.Net.Cache.HttpRequestCachePolicy(System.Net.Cache.HttpRequestCacheLevel.NoCacheNoStore) })) { client.Timeout = TimeSpan.FromMilliseconds(10000); HttpResponseMessage response; try { response = await client.PostAsync(url, content); } catch (HttpRequestException) { System.Diagnostics.Debug.WriteLine("通信エラー"); return Util.Define.ERROR; } if (response.IsSuccessStatusCode) { string result = await response.Content.ReadAsStringAsync(); if (result != "") { JToken jToken = JToken.Parse(result); return jToken; } else { // レスポンスで受け取る情報なし return ""; } } else { System.Diagnostics.Debug.WriteLine("通信失敗(fail) statusCode:" + response.StatusCode); return Util.Define.FAIL; } }
↓上記メソッドを用いて例えばログインAPIを以下のように実装しています
・引数にて通信終了後に実行するメソッドを受け取る
→ 例えば他のクラスでこのメソッドを使用し、通信成功時にTextBlockのTextを変更するメソッドを引数としてわたしていたら循環参照起きる??(weakの設定が必要かなと思っています)
public static async void LoginAsync(string name, string password, Action successLogin, Action failLogin, Action errorLogin) { var content = new Dictionary<string, Object>() { {"name:", name}, {"pass", password} }; var response = await RequestPostAsync("loginApiPass", content, ""); if (response.ToString() == Util.Define.ERROR) { errorLogin(); } else if (response.ToString() == Util.Define.FAIL) { failLogin(); } else { successLogin(); } }
回答1件
あなたの回答
tips
プレビュー