びぼーろくっ!

誰かに見せるわけでもないけど、備忘録として。。

仕様変更で没になったので・・・

仕様変更で没になったので・・・

せっかく書いたのに悔しいので載せます。
ソースを見れば一目ですが、HTTPでリクエストを飛ばす処理になってます。
時間が無くて動作確認してないです。多分POSTでつまづくかも。。


簡単な解説
DELETEやPUT、PATCHは未記入ですが同じような要領でいけます。
戻りをTモデルにしてあるのでどのクラスでもマッピングしてくれるように書きました。
リクエスト先の戻りはJSONを想定して書いてます。

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace MyNameSpace.Request
{
    public class RequestService
    {
        /// <summary>
        /// GETメソッド
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task<T> Get<T>(string url, Dictionary<string, dynamic> parameters = null)
        {
            var queryParams = createQueryParameter(parameters);
            var http = new HttpClient();
            http.DefaultRequestHeaders.Add("contentType", "application/json");

            var res = await http.GetAsync(url + queryParams);
            var body = await res.Content.ReadAsStringAsync();

            return serializeBody<T>(body);
        }

        /// <summary>
        /// POST
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task<T> Post<T>(string url, object data)
        {
            var http = new HttpClient();
            http.DefaultRequestHeaders.Add("contentType", "application/json");

            var param = createNameValueCollection(data);
            var content = new FormUrlEncodedContent(param.ToArray());
            var body = "";
            try
            {
                var res = await http.PostAsync(url, content);
                body = await res.Content.ReadAsStringAsync();
            }
            catch (Exception e)
            {
                var msg = e.Message;
            }
            return serializeBody<T>(body);
        }

        /// <summary>
        /// 受け取ったJSONをTモデルにシリアライズする
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private T serializeBody<T>(string body)
        {
            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(body)))
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                return (T)serializer.ReadObject(stream);
            }
        }

        /// <summary>
        /// 送信用のデータをキャストする
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private List<KeyValuePair<string, string>> createNameValueCollection(object data)
        {
            var bodies = new List<KeyValuePair<string, string>>();
            var type = data.GetType();
            foreach (var prop in type.GetProperties())
            {
                var name = prop.Name;

                if (prop.PropertyType.IsArray)
                {
                    var values = (IEnumerable)prop.GetValue(data, null);
                    foreach (var arrProp in values)
                    {
                        var arrValue = arrProp.ToString();
                        bodies.Add(new KeyValuePair<string, string>(name, arrValue));
                    }
                } else if (prop.PropertyType.Name == "DateTime") {
                    var value = ((DateTime)prop.GetValue(data, null)).ToShortDateString();
                    bodies.Add(new KeyValuePair<string, string>(name, value));

                } else {
                    var value = prop.GetValue(data, null).ToString();
                    bodies.Add(new KeyValuePair<string, string>(name, value));
                }
            }
            return bodies;
        }

        /// <summary>
        /// GET専用・クエリパラメータを作成
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private string createQueryParameter(Dictionary<string, dynamic> parameters)
        {
            if (parameters == null || parameters.Count == 0) return "";
            var list = new List<string>();
            foreach(var param in parameters)
            {
                var builder = new StringBuilder();
                builder.Append(param.Key).Append("=").Append(param.Value);
                list.Add(builder.ToString());
            }
            var arr = list.ToArray();
            return "?" + string.Join("&", arr);
        }
    }
}