首先建立了一個單元測試,以下項目視圖:json
分頁結果映射類PageResult的編寫:api
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReuqestDemo { /// <summary> /// 分頁結果 /// </summary> /// <typeparam name="T"></typeparam> public class PageResult<T> where T : class { public PageResult() { this.Results = new List<T>(); } /// <summary> /// 頁碼 /// </summary> public int PageNo { get; set; } /// <summary> /// 頁量 /// </summary> public int PageSize { get; set; } /// <summary> /// 條數 /// </summary> public int RecordCount { get; set; } /// <summary> /// 頁數 /// </summary> public int PageCount { get; set; } public List<T> Results { get; set; } } /// <summary> /// 原始的返回結果 /// </summary> public class StartReturnResult<T> where T : class { /// <summary> /// 分頁結果 /// </summary> public StartPageResult<T> Result { get; set; } /// <summary> /// 總頁數 /// </summary> public int TotalPageCount { get; set; } } /// <summary> /// 原始的分頁結果 /// </summary> public class StartPageResult<T> where T : class { public StartPageResult() { this.Results = new List<T>(); } /// <summary> /// 開始位置 /// 值始終爲0 /// </summary> public int Start { get; set; } /// <summary> /// 每頁數量 /// </summary> public int PageSize { get; set; } /// <summary> /// 數據總數 /// </summary> public int TotalCount { get; set; } /// <summary> /// 數據集合 /// </summary> public List<T> Results { get; set; } /// <summary> /// 頁碼 /// 值始終爲1 /// </summary> public int Page { get; set; } /// <summary> /// 頁碼 /// 值始終爲1 /// </summary> public int CurrentPageNo { get; set; } /// <summary> /// 總頁數 /// </summary> public int TotalPageCount { get; set; } } }
檢索條件SearchCondition以下:app
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReuqestDemo { /// <summary> /// 檢索條件 /// </summary> public class SearchCondition { /// <summary> /// 檢索關鍵字 /// </summary> public string Keyword { get; set; } /// <summary> /// 檢索的頁碼 /// </summary> public int PageNo { get; set; } } }
Helper文件夾下的DataSerializer類以下:async
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ReuqestDemo.Helpers { /// <summary> /// 數據序列化器 /// </summary> public static class DataSerializer { /// <summary> /// json 序列號 /// </summary> /// <param name="source">要序列化的對象</param> /// <param name="b">是否忽略空值,true爲不忽略</param> /// <returns></returns> public static string SerizlizeToJSON(object source,bool b=true) { var setting = new JsonSerializerSettings(); setting.ContractResolver = new SortedContractResolver(); if (!b) { setting.NullValueHandling = NullValueHandling.Ignore; //忽略空對象 } var jsonString = JsonConvert.SerializeObject(source, setting); return jsonString; } public static TData DeserializeFromJSON<TData>(string jsonString) { var data = JsonConvert.DeserializeObject<TData>(jsonString); return data; } } public class SortedContractResolver : DefaultContractResolver { protected override List<MemberInfo> GetSerializableMembers(Type objectType) { var members = base.GetSerializableMembers(objectType); return members.OrderBy(m => m.Name).ToList(); } } }
Helper文件夾下的HttpRequester類以下:ide
using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using System.Web; namespace ReuqestDemo.Helpers { public static class HttpRequester { public const string CONTENT_TYPE_JSON = "application/json"; public const string CONTENT_TYPE_FORM = "application/x-www-form-urlencoded"; public static async Task<TResult> PostAsync<TResult>(HttpClient client, string url, string dataString, IDictionary<string, string> headers = null) { var rsp = await PostAsync(client, url, dataString, CONTENT_TYPE_FORM, headers); var res = DataSerializer.DeserializeFromJSON<TResult>(rsp); return res; } public static async Task<string> PostAsync(HttpClient client, string url, string dataString, string contentType, IDictionary<string, string> headers = null) { using (HttpContent content = new StringContent(dataString)) { var mt = new MediaTypeHeaderValue(contentType) { CharSet = "UTF-8" }; content.Headers.ContentType = mt; if (headers != null) { foreach (var item in headers) { content.Headers.Add(item.Key, item.Value); } } var rsp = await client.PostAsync(url, content); rsp.EnsureSuccessStatusCode(); var text = await rsp.Content.ReadAsStringAsync(); return text; } } public static string CombinParametersUrlEncode(IEnumerable<KeyValuePair<string, string>> parameters) { return CombinParameters(parameters, true); } private static string CombinParameters(IEnumerable<KeyValuePair<string, string>> parameters, bool isUrlEncode) { var pStr = string.Empty; if (parameters != null) { var pSB = new StringBuilder(); if (isUrlEncode) { foreach (var p in parameters) { pSB.Append(HttpUtility.UrlEncode(p.Key)).Append("=").Append(HttpUtility.UrlEncode(p.Value)).Append("&"); } } else { foreach (var p in parameters) { pSB.Append(p.Key).Append("=").Append(p.Value).Append("&"); } } pStr = pSB.ToString(); } if (string.IsNullOrEmpty(pStr)) return pStr; return pStr.Substring(0, pStr.Length - 1); } } }
Helper文件夾下的TimeHelper類以下:單元測試
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReuqestDemo.Helpers { public static class TimeHelper { /// <summary> /// 返回時間戳 /// </summary> /// <returns>時間戳</returns> public static long GetTimeStamp() { TimeSpan tSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(tSpan.TotalMilliseconds); } /// <summary> /// 返回時間戳 /// </summary> /// <returns>時間戳</returns> public static string GetTStamp() { return GetTimeStamp().ToString(); } } }
Models文件夾下的ResultModel類以下:學習
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReuqestDemo.Models { /// <summary> /// 請求結果圖示 /// </summary> public class ResultModel { /// <summary> /// 惟一標識 /// </summary> public string Id { get; set; } /// <summary> /// 公司名稱 /// </summary> public string EntName { get; set; } } }
Models文件夾下的SearchArgument類以下:測試
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReuqestDemo.Models { /// <summary> /// 檢索參數 /// </summary> public class SearchArgument { /// <summary> /// 檢索關鍵字 /// </summary> public string Keyword { get; set; } /// <summary> /// 檢索的頁碼 /// </summary> public int Page { get; set; } public int SearchType { get; set; } } }
CompanyData,用於接口的的實現ui
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Http; using System.Threading.Tasks; using ReuqestDemo.Models; using ReuqestDemo.Helpers; namespace ReuqestDemo { public class CompanyData { #region 保護屬性 protected HttpClient _client = new HttpClient() { Timeout = new TimeSpan(0, 0, 3) }; #endregion #region 公共方法 /// <summary> /// 分頁獲取數據 /// </summary> /// <param name="condition">分頁檢索條件</param> /// <returns></returns> public async Task<PageResult<ResultModel>> GetDataByPage(SearchCondition condition) { #region 參數轉換 var arg = new SearchArgument() { Keyword = condition.Keyword, //查詢條件 SearchType = 1, Page = condition.PageNo //查詢頁數,即第幾頁 }; #endregion var res = await this.GetByPage(arg); return res; } #endregion #region 保護方法 protected async Task<PageResult<ResultModel>> GetByPage(SearchArgument ccsa) { string url = $"。。。。。。"; //發送請求 var data = await HttpRequester.PostAsync<StartReturnResult<ResultModel>>(_client, url, this.getReuestBody(ccsa), this.getRequestHeaders()); //映射結果 var res = this.mappingResult<ResultModel>(data.Result); res.PageNo = ccsa.Page; return res; } #endregion #region 私有方法 private string getReuestBody(SearchArgument ccsa) { var parameters = new Dictionary<string, string>(); parameters.Add("keyword", ccsa.Keyword); parameters.Add("searchtype", ccsa.SearchType.ToString()); parameters.Add("page", ccsa.Page.ToString()); var body = HttpRequester.CombinParametersUrlEncode(parameters); return body; } private IDictionary<string, string> getRequestHeaders() { var headers = new Dictionary<string, string>(); return headers; } /// <summary> /// 映射結果的分頁狀況 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="source"></param> /// <returns></returns> private PageResult<T> mappingResult<T>(StartPageResult<T> source) where T : class { var target = new PageResult<T>(); target.PageCount = source.TotalPageCount; target.RecordCount = source.TotalCount; target.Results = source.Results; target.PageSize = source.PageSize; target.PageNo = source.CurrentPageNo; return target; } #endregion } }
單元測試得調用以下:this
public void TestMethod1() { var i = new CompanyData(); var res = i.GetDataByPage(new SearchCondition() { Keyword = "一", PageNo = 1 }); Assert.IsNotNull(res); }
如上就是實現了請求的分頁獲取,上面主要是對比了我寫的請求(在以前的對比中有篇」單元測試以文件流的形勢傳參調用api進行測試「寫的請求太過簡單),作一個對比,因此須要本身學習的地方,就作了一個demo簡單的抽離了出來總結。