請求Url返回數據較大,使結果分頁獲取

                   首先建立了一個單元測試,以下項目視圖: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; }
    }
}
View Code

                    檢索條件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; }
    }
}
View Code

                     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();
        }
    }
}
View Code

                     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);
        }
    }
}
View Code

                     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();
        }
    }
}
View Code

                     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; }

    }
}
View Code

                     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; }
    }
}
View Code

                    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
    }
}
View Code

                    單元測試得調用以下:this

        public void TestMethod1()
        {
            var i = new CompanyData();
            var res = i.GetDataByPage(new SearchCondition() { Keyword = "", PageNo = 1 });
            Assert.IsNotNull(res);
        }

                    如上就是實現了請求的分頁獲取,上面主要是對比了我寫的請求(在以前的對比中有篇」單元測試以文件流的形勢傳參調用api進行測試「寫的請求太過簡單),作一個對比,因此須要本身學習的地方,就作了一個demo簡單的抽離了出來總結。

相關文章
相關標籤/搜索