WPFエッセイ(五)--HttpClientサードパーティWebAPIインタフェースへのアクセス


WPFプロジェクトでは、サードパーティのWebAPIインタフェースからデータを取得する必要がある場合があります.この場合、Systemに使用する必要がある.Net.Httpネーミング空間におけるHttpClientクラスは,コード多重化率を高めるために,HttpClientがAPIインタフェースにアクセスする方法を汎用クラスにするのもよい考えである.

WebAPIベースアドレスの設定


同じサイトの異なるAPIインタフェースにアクセスする必要がある場合が多いため、サイトベースアドレスを共通変数に設定することができ、プロファイルで変更できることが望ましい.
public static readonly string BaseUri = ConfigurationManager.AppSettings["ApiUri"];

GETメソッド

        #region GET  --    

        /// 
        /// GET  --    
        /// 
        /// 
        ///   
        ///   
        /// 
        public static async Task TryGetAsync(string action, Dictionary param)
        {
            using (HttpClient client = new HttpClient())
            {
                //   /  
                client.BaseAddress = new Uri(BaseUri);
                //       json
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));
                //client.DefaultRequestHeaders.Add("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");

                StringBuilder strUri = new StringBuilder();
                //  
                strUri.AppendFormat("{0}?", action);
                //  
                if (param.Count > 0)
                {
                    foreach (KeyValuePair pair in param)
                    {
                        strUri.AppendFormat("{0}={1}&&", pair.Key, pair.Value);
                    }
                    strUri.Remove(strUri.Length - 2, 2); //  '&&'
                }
                else
                {
                    strUri.Remove(strUri.Length - 1, 1); //  '?'
                }
                HttpResponseMessage response = await client.GetAsync(strUri.ToString());
                if (response.IsSuccessStatusCode)
                {
                    return await response.Content.ReadAsAsync();
                }
                return default(T);
            }
        }

        #endregion

        #region    GET  --    

        /// 
        ///    GET  --    
        /// 
        /// 
        /// 
        /// 
        public static async Task TryGetAsync(string action)
        {
            using (HttpClient client = new HttpClient())
            {
                //   /  
                client.BaseAddress = new Uri(BaseUri);
                //       json
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage response = await client.GetAsync(action);
                if (response.IsSuccessStatusCode)
                {
                    return await response.Content.ReadAsAsync();
                }
                return default(T);
            }
        }

        #endregion

POSTメソッド

        #region POST  --    

        /// 
        /// POST  --    
        /// 
        /// 
        ///   
        ///   
        /// 
        public static async Task TryPostAsync(string action, object param)
        {
            using (HttpClient client = new HttpClient())
            {
                //   /  
                client.BaseAddress = new Uri(BaseUri);
                //       json
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage response = await client.PostAsync(action, param, new JsonMediaTypeFormatter());
                if (response.IsSuccessStatusCode)
                {
                    return await response.Content.ReadAsAsync();
                }
                return default(T);
            }
        }

        #endregion


ファイルのアップロード

        #region       --   --    

        /// 
        ///       --   --    
        /// 
        /// 
        /// 
        /// 
        /// 
        public static async Task TryUploadAsync(string action, Dictionary filePaths,
            Dictionary param)
        {
            using (HttpClient client = new HttpClient())
            {
                using (var content = new MultipartFormDataContent())
                {
                    //   /  
                    client.BaseAddress = new Uri(BaseUri);
                    foreach (var filePath in filePaths)
                    {
                        var fileContent = new ByteArrayContent(File.ReadAllBytes(filePath.Key));
                        fileContent.Headers.ContentDisposition =
                            new ContentDispositionHeaderValue("attachment")
                            {
                                FileName = filePath.Value
                            };
                        content.Add(fileContent);
                    }
                    foreach (var pair in param)
                    {
                        var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(pair.Value));
                        dataContent.Headers.ContentDisposition =
                            new ContentDispositionHeaderValue("attachment") {Name = pair.Key};
                        content.Add(dataContent);
                    }
                    HttpResponseMessage response = await client.PostAsync(action, content);
                    if (response.IsSuccessStatusCode)
                    {
                        return await response.Content.ReadAsStringAsync();
                    }
                    return await Task.FromResult("");
                }
            }
        }

        #endregion