首先创建了一个单元测试,如下项目视图:

分页结果映射类PageResult的编写:

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如下:

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类如下:

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类如下:

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(, pStr.Length - );
}
}
}

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(, , , , , , );
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,用于接口的的实现

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(, , ) }; #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 = ,
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
}
}

单元测试得调用如下:

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

如上就是实现了请求的分页获取,上面主要是对比了我写的请求(在之前的对比中有篇”单元测试以文件流的形势传参调用api进行测试“写的请求太过简单),做一个对比,所以需要自己学习的地方,就做了一个demo简单的抽离了出来总结。

请求Url返回数据较大,使结果分页获取的更多相关文章

  1. Mock拦截请求URL返回模板数据

    背景 : 前后端开发依赖后端数据, 当前端页面开发完成 ,后端在没有提供前端数据的情况下 ,前端无法测试, 导致开发效率低 ,速度慢 ,为了解决这一问题 ,通过Mock模拟生成数据在不改变原有代码前提 ...

  2. http statusCode(状态码)请求URL返回状态值的含义

    http statusCode(状态码)请求URL返回状态值的含义 请求URL浏览器返回状态码的含义(http statusCode): 201-206都表示服务器成功处理了请求的状态代码,说明网页可 ...

  3. charles技能之修改请求参数/返回数据(map Local、Rewrite、Breakpoints)

    之前一直用postman调接口比较多,但有时候想要去修改APP的页面展示,造数据又会比较麻烦,此时可以用以下三种方法修改请求参数或修改响应: map Local(本地映射).Breakpoints(打 ...

  4. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  5. DRF 返回数据的封装,和分页

    DRF 返回数据的封装,和分页 1 返回值的 封装 自定义一个类,初始化基本的返回数据信息 class BaseResponse(object): """ 初始化基本的返 ...

  6. JQuery请求WebService返回数据的几种处理方式

    打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...

  7. HttpURL连接远程serverGet和Post方式请求并返回数据

    查看原文:http://www.ibloger.net/article/1813.html package cn.gis; import java.io.BufferedReader; import ...

  8. Java实现发送HTTP的POST请求,返回数据以及请求状态

    /** * @param url:请求url * @param content: 请求体(参数) * @return errorStr:错误信息;status:状态码,response:返回数据 */ ...

  9. Fiddler修改请求、返回数据

    相信你们有听过说“绕过前端”,但是可能想不到要怎样才能绕过前端呢? 首先,我们要知道什么是绕过前端?比如:登录用户名限制数字.6位,用户在登录页面填写用户名符合要求,使用Fiddler作为代理,拦截登 ...

随机推荐

  1. JavaScript DOM编程艺术读后感(1)—— 平稳退化

    最近,在读<JavaScript DOM编程艺术(第二版)>这本书,想着将自己的读后感记录下来,作为记忆吧. 其实我并不是最近才刚开始读这本书的,我读了有一段时间了.我是一名web前端开发 ...

  2. css的背景background的相关属性

    今天需要做一个占满设备宽度的轮播图,这里作为demo仅展示一张图,下面分别是要操作的图片(这里做了缩放处理,实际的图比较大),以及要实现的效果图,很明显两者是不成比例的:      (图一)     ...

  3. iOS Socket 整理以及CocoaAsyncSocket、SRWebSocket源码解析(一)

    写在准备动手的时候: Socket通讯在iOS中也是很常见,自己最近也一直在学习Telegram这个开源项目,Telegram就是在Socket的基础上做的即时通讯,这个相信了解这个开源项目的也都知道 ...

  4. nessus重置密码

    许久不用的nessus密码居然忘记了,查了下: cmd下进入到nessus的安装目录 提升为管理员,登录系统 如果想用之前的账号,可以直接在系统内重置密码.

  5. TASKCTL敏捷调度理念的诠释

    功能完整是基本,简单易用才是王道,这就是TASKCTL对敏捷的朴素定义.功能少,怎么复杂也会简单:而功能体系完整,怎么简单也会复杂.因此,简单与复杂是相对的,而TASKCTL正是追求那种在功能完整不可 ...

  6. WebApi Ajax 跨域请求解决方法(CORS实现)

    概述 ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, 特别 ...

  7. 编写一个简单的TCP服务端和客户端

    下面的实验环境是linux系统. 效果如下: 1.启动服务端程序,监听在6666端口上  2.启动客户端,与服务端建立TCP连接  3.建立完TCP连接,在客户端上向服务端发送消息 4.断开连接 实现 ...

  8. 【python密码学编程】5.反转加密法

    #Reverse Cipher message = 'there can keep a secret,if two of them are dead.' translated = '' i = len ...

  9. [转载]Splay Tree数组实现+详解

    变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i]表示i的关键字(即结点i代表的那个数字),cnt[i]表示i结点的关键字出现的次数(相当于 ...

  10. Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介

    在大数据程序流行的今天,许多程序都面临着共同的难题:程序输入数据趋于无限大,抵达时间又不确定.一般的解决方法是采用回调函数(callback-function)来实现的,但这样的解决方案很容易造成“回 ...