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

分页结果映射类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. 教你做炫酷的碎片式图片切换 (canvas)

    前言 老规矩,先上 DEMO 和 源码.图片区域是可以点击的,动画会从点击的位置开始发生. 本来这个效果是我3年前做的,只是当是是用无数个 div 标签完成的,性能比较成问题,在移动端完全跑不动.最近 ...

  2. struts加载spring

    为了在Struts中加载Spring context,需要在struts-config.xml文件中加入如下部分: <struts-config> <plug-in classNam ...

  3. (转)Centos7 Nginx安装

    场景:工作中使用的suse,因为系统可可查资料太少,且系统中一些功能的确实,导致很多集群中功能无法顺利测试通过,在Centos上面进行测试,能够更快的熟悉项目的架构过程! 1 安装准备 首先由于ngi ...

  4. 【MYSQL】ubuntu13安装mysql(转)

    安装的是mysql-5.0.87-linux-i686-glibc23.tar.gz 1.解压tar.gz tar –xzf mysql-5.0.87-linux-i686-glibc23.tar.g ...

  5. 关于vue组件的一个小结

    用vue进行开发到目前为止也有将近一年的时间了,在项目技术选型的时候隔壁组选 react的时候我们坚持使用vue作为前端的开发框架.虽然两者思想上的差异不大,但是vue的语法在代码的可读性以及后期的维 ...

  6. 百度地图api将可视区域定位到当前所在位置

    1.前言 开头不说点什么,总是有点不习惯.还是说点什么吧,关于百度地图,我用的次数还是比较多的,没办法,需求呀.好吧,在用百度地图的时候,确实有过很多需求,不过好在百度地图很强大,每次需求在探索后都能 ...

  7. 高效搭建lnmp环境

    1:安装nginx       sudo apt-get install nginx       检测 nginx   : sudo nginx -t  出现如下表示成功        2:安装配置m ...

  8. centos中安装mysql

    一.首先输入指令 rpm -qa|grep mysql 检查操作系统中是否已经安装了MySQL 可以通过 yum list | grep mysql 命令来查看yum上提供的mysql数据库可下载的版 ...

  9. 小程序server-3-搭建WebSocket 服务

    小程序server-3-搭建WebSocket 服务: 1.安装 Node 模块 使用 ws 模块来在服务器上支持 WebSocket 协议,下面使用 NPM 来安装: cd /var/www/wxp ...

  10. 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换 a 和 b 的值。

    这不具有可移植性.它试图在序列点之间两次修改变量 a, 而这是无定义的. 例如,有人报告如下代码: int a = 123, b = 7654; a ^= b ^= a ^= b; 在 SCO 优化 ...