请求Url返回数据较大,使结果分页获取
首先创建了一个单元测试,如下项目视图:

分页结果映射类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返回数据较大,使结果分页获取的更多相关文章
- Mock拦截请求URL返回模板数据
背景 : 前后端开发依赖后端数据, 当前端页面开发完成 ,后端在没有提供前端数据的情况下 ,前端无法测试, 导致开发效率低 ,速度慢 ,为了解决这一问题 ,通过Mock模拟生成数据在不改变原有代码前提 ...
- http statusCode(状态码)请求URL返回状态值的含义
http statusCode(状态码)请求URL返回状态值的含义 请求URL浏览器返回状态码的含义(http statusCode): 201-206都表示服务器成功处理了请求的状态代码,说明网页可 ...
- charles技能之修改请求参数/返回数据(map Local、Rewrite、Breakpoints)
之前一直用postman调接口比较多,但有时候想要去修改APP的页面展示,造数据又会比较麻烦,此时可以用以下三种方法修改请求参数或修改响应: map Local(本地映射).Breakpoints(打 ...
- asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。
原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...
- DRF 返回数据的封装,和分页
DRF 返回数据的封装,和分页 1 返回值的 封装 自定义一个类,初始化基本的返回数据信息 class BaseResponse(object): """ 初始化基本的返 ...
- JQuery请求WebService返回数据的几种处理方式
打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...
- HttpURL连接远程serverGet和Post方式请求并返回数据
查看原文:http://www.ibloger.net/article/1813.html package cn.gis; import java.io.BufferedReader; import ...
- Java实现发送HTTP的POST请求,返回数据以及请求状态
/** * @param url:请求url * @param content: 请求体(参数) * @return errorStr:错误信息;status:状态码,response:返回数据 */ ...
- Fiddler修改请求、返回数据
相信你们有听过说“绕过前端”,但是可能想不到要怎样才能绕过前端呢? 首先,我们要知道什么是绕过前端?比如:登录用户名限制数字.6位,用户在登录页面填写用户名符合要求,使用Fiddler作为代理,拦截登 ...
随机推荐
- 关于position:fixed;的居中问题
通常情况下,我们通过操作margin来控制元素居中,代码如下: #name{ maigin:0px auto; } 但当我们把position设置为fixed时,例如: #id{ position:f ...
- Android 上层应用读写设备节点
Android 上层应用读写设备节点 Android L [TOC] 1. Android 设备节点 Android基于Linux内核.设备节点文件是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动 ...
- iOS App签名的原理
前言 相信很多同学对于iOS的真机调试,App的打包发布等过程中的各种证书.Provisioning Profile. CertificateSigningRequest.p12的概念是模糊的,导致在 ...
- (转)@ContextConfiguration注解说明
场景:学习spring实战中相关的单元测试 1 正常使用 @ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件 1.1 单个文件 @ContextC ...
- 关于JavaScript组件化的探索
Loaders 先放出项目地址:https://github.com/j20041426/Loaders 这是一个可以动态选择加载动画的样式和颜色的插件.这个项目仅仅是作为对js组件化的一个探索,不太 ...
- 【bzoj1458】士兵占领
Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...
- PHP执行linux命令mkdir权限问题
在linux系统中,root帐号执行php命令: mkdir('test', 0777); 结果文件的权限依然为: drwxr-xr-x 2 root root Jul 27 19:30 test ...
- Linux服务器中安装Oracle
笔者手动安装成功 一,oracle安装前的准备与配置 1,修改stsctl.conf文件 Linux是为小文件设计的,Oracle数据库安装需要占用较多资源,要把各项参数调大. 使用vi编辑/etc/ ...
- annotation-config, annotation-driven, compont-scan 区别
<annotaion-driven/>标签: 这个标签对应的实现类是org.springframework.web.servlet.config.AnnotationDrivenBeanD ...
- 用 Node.js 把玩一番 Alfred Workflow
插件地址(集成Github.掘金.知乎.淘宝等搜索) 作为 Mac 上常年位居神器榜第一位的软件来说,Alfred 给我们带来的便利是不言而喻的,其中 workflow(工作流) 功不可没,在它上面可 ...