请求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作为代理,拦截登 ...
随机推荐
- 针对Oracle数据库中SCOTT方案的多表查询一个例子
查询出每个员工的姓名.职位.月薪.所属部门名.月薪等级及其领导的姓名.职位.所属部门名.月薪等级.select e.ename 员工姓名,e.job 员工职位,e.sal 员工月薪,d.dname 员 ...
- @Component @Controller @Service @Repository@Resourse
@Component @Controller @Service @Repository@Resourse这些全部是Spring提供的注解. 其中@Component用来表示把一个类纳入spring容器 ...
- Groovy - 介绍
Groovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言.使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的 ...
- 运行shell脚本时报错"[[ : not found"解决方法
问题描述 在运行shell脚本时报错,命令为: sh test.sh 报错如图: 脚本代码如下: #!/bin/bash # file:test.sh # author:13 # date:2017- ...
- 用runtime封装归档(encoding)
runtime一套比较基层的c语言的API(库) 归档(OC对象-->字典—>2进制—>写入沙盒 || 目的.数据持久化) #import <UIKit/UIKit.h&g ...
- HDU 6035---Colorful Tree(树形DP)
题目链接 Problem Description There is a tree with n nodes, each of which has a type of color represented ...
- 利用GPU实现大规模动画角色的渲染
0x00 前言 我想很多开发游戏的小伙伴都希望自己的场景内能渲染越多物体越好,甚至是能同时渲染成千上万个有自己动作的游戏角色就更好了. 但不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为 ...
- centos中安装mysql
一.首先输入指令 rpm -qa|grep mysql 检查操作系统中是否已经安装了MySQL 可以通过 yum list | grep mysql 命令来查看yum上提供的mysql数据库可下载的版 ...
- Vmware Tools 下载及安装方法
Vmware Tools 下载及安装方法 王尚2014.11.20 一.介绍 VMware Tools 是VMware 虚拟机中自带的一种增强工具,相当于 VirtualBox 中的增强功能(Sun ...
- POJ 1113 Wall (凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...