RestSharp简单扩展
using RestSharp;
using RestSharp.Deserializers;
using RestSharp.Serializers;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;
namespace RestSharp.Extension
{
public class RestAPIClient
{
private RestClient _client;
public RestClient Client { get { return _client; } }
public RestAPIClient(string baseUri)
{
this._client = new RestClient(baseUri);
//使用CookieContainer自动管理cookie
this._client.CookieContainer = new System.Net.CookieContainer();
}
/// <summary>
/// 发送一个HTTP请求
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="resource">资源地址</param>
/// <param name="method">请求方式</param>
/// <param name="body">请求参数</param>
/// <param name="setRequest">设置请求参数委托</param>
/// <returns>返回T对象</returns>
/// <remarks>当Method为Get的时候,body只能是简单的匿名对象,即匿名对象中不能在包含匿名对象</remarks>
public T Execute<T>(string resource, Method method, object body = null, Action<IRestRequest> setRequestParam = null)
where T : new()
{
return ExecuteRaw<T>(resource, method, body, setRequestParam).Data;
}
/// <summary>
/// 发送一个HTTP请求
/// </summary>
/// <param name="resource">资源地址</param>
/// <param name="method">请求方式</param>
/// <param name="body">请求参数</param>
/// <param name="setRequest">设置请求参数委托</param>
/// <returns>返回一个包括所有服务器响应信息的原始对象</returns>
public IRestResponse ExecuteRaw(string resource, Method method, object body = null, Action<IRestRequest> setRequestParam = null)
{
var request = BuildRequest(resource, method, body, setRequestParam);
return _client.Execute(request);
}
/// <summary>
/// 发送一个异步HTTP请求
/// </summary>
/// <param name="resource">资源地址</param>
/// <param name="callback">异步回调函数</param>
/// <param name="method">请求方式</param>
/// <param name="body">请求参数</param>
/// <param name="setRequest">设置请求参数委托</param>
/// <returns></returns>
public RestRequestAsyncHandle ExecuteRawAsync(string resource, Action<IRestResponse> callback, Method method, object body = null, Action<IRestRequest> setRequestParam = null)
{
var request = BuildRequest(resource, method, body, setRequestParam);
return _client.ExecuteAsync(request, callback);
}
/// <summary>
/// 发送一个HTTP请求
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="resource">资源地址</param>
/// <param name="method">请求方式</param>
/// <param name="body">请求参数</param>
/// <param name="setRequest">设置请求参数委托</param>
/// <returns>返回一个包括所有服务器响应信息的原始对象及反序列化的T对象Data</returns>
public IRestResponse<T> ExecuteRaw<T>(string resource, Method method, object body = null, Action<IRestRequest> setRequestParam = null)
where T : new()
{
var request = BuildRequest(resource, method, body, setRequestParam);
return _client.Execute<T>(request);
}
/// <summary>
/// 发送一个异步HTTP请求
/// </summary>
/// <param name="resource">资源地址</param>
/// <param name="callback">回调函数</param>
/// <param name="method">请求方式</param>
/// <param name="body">请求参数</param>
/// <param name="setRequest">设置请求参数委托</param>
/// <returns></returns>
public RestRequestAsyncHandle ExecuteRawAsync<T>(string resource, Action<IRestResponse<T>> callback, Method method, object body = null, Action<IRestRequest> setRequestParam = null)
where T : new()
{
var request = BuildRequest(resource, method, body, setRequestParam);
return _client.ExecuteAsync<T>(request, callback);
}
/// <summary>
/// 组装请求
/// </summary>
/// <param name="resource">请求URL</param>
/// <param name="method">请求类型</param>
/// <param name="body">请求体</param>
/// <param name="setRequest">设置请求参数委托</param>
/// <returns></returns>
private RestRequest BuildRequest(string resource, Method method, object body = null, Action<IRestRequest> setRequestParam = null)
{
if (string.IsNullOrWhiteSpace(resource))
{
throw new ArgumentNullException("resource", "请求资源url不能为空。");
}
var request = new RestRequest(method)
{
Resource = resource,
RequestFormat = DataFormat.Json,
DateFormat = "yyyy-MM-dd HH:mm:ss",
//JsonSerializer = new RestJsonSerializer("application/json")
};
//默认传递数据格式及响应格式都为json
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept", "application/json");
//添加请求体
if (body != null && new Method[] { Method.PUT, Method.POST }.Contains(method))
{
//该方法只能用于POST或PUT请求
request.AddBody(body);
}
else
{
//Get或其他请求,body只能是一个简单匿名对象
request.AddObject(body);
}
//执行设置请求参数委托
if (setRequestParam != null)
{
setRequestParam.Invoke(request);
}
return request;
}
}
}
RestSharp简单扩展的更多相关文章
- 对bootstrap modal的简单扩展封装
对bootstrap modal的简单扩展封装 参考自:http://www.muzilei.com/archives/677 注:原文不支持bootstrap新版本,并且居中等存在问题 此段时间 ...
- Log4net创建日志及简单扩展
转:http://blog.csdn.net/CHENFEIYANG2009/article/details/5397342 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log ...
- 使用Log4net创建日志及简单扩展
如何使用Log4net创建日志及简单扩展 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的 ...
- 由一道面试题简单扩展 — setTimeout、闭包
在一个前端公众号,看到这么一个号称简单的面试题: 1.以下程序输出什么? <script type="text/javascript"> function init() ...
- asp.net mvc Htmlhelper简单扩展
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- C# AutoMapper的简单扩展
AutoMapper可以很方便的将一个实体的属性值转化给另一个对象.这个功能在我们日常的编码中经常会遇到.我将AutoMapper的一些基本映射功能做成扩展方法,在编码中更方便使用. using Sy ...
- Enum的简单扩展
1 添加一个描述的Attribute public enum MessageResult { [System.ComponentModel.Description("未通过")] ...
- 数据类型 简单扩展(Java)
public class HelloWorld { public static void main(String[] args) { //整数拓展 进制 二进制0b 十进制 八进制0 十六进制0x i ...
- 如何使用Log4net创建日志及简单扩展
第一步:在项目中添加对log4net.dll的引用,这里引用版本是1.2.10.0.第二步:程序启动时读取log4net的配置文件.如果是CS程序,在根目录的Program.cs中的Main方法中添加 ...
随机推荐
- IOS系列swift语言之课时四
今天我们要讲的主要有:下标.可为空的类型.枚举(特殊的枚举:递归枚举).原生值.关联值 首先来分析一下这个下标,就是说我们可以通过下标找到对应的值或者是改变对应的值. 其次是可为空的类型,我们要牢记所 ...
- 使用Linux碎解二
承接上文碎解一.本章讲述,基本配置. 一.网络配置相关. error:(执行yum 命令时出现)Cannot find a valid baseurl for repo:base/7/x86_64 解 ...
- 查linux端口连接情况用命令netstat
查linux端口连接情况用命令netstat netstat -apn |grep cdnbest 或netstat –apn | grep 3320
- linux系统数据盘挂载教程
将数据盘挂载为/www命令:#mkdir /www & mount /dev/sdb1 /www ----------------------------------------------- ...
- 图情期刊要求2015(A,B,C类)
中国图书馆学报+情报学报+大学图书馆学报+图书情报工作+图书情报知识+情报理论与实践+国家图书馆学刊+情报杂志+图书与情报+情报科学+图书馆杂志+图书馆建设+情报资料工作+图书馆论坛+现代图书情报技术 ...
- iOS(视图控制器转场)
转场需要提供转场代理,不使用默认的代理则需要自己实现代理方式,有UINavigationController.UITabBarController.UIViewController三种代理,实现以下三 ...
- ZOJ 3209 Treasure Map (Dancing Links)
Treasure Map Time Limit: 2 Seconds Memory Limit: 32768 KB Your boss once had got many copies of ...
- xml/map转换器,递归设计思路
xml/map转换器 图片:http://pan.baidu.com/s/1nuKJD13 应用场景,为什么要把xml转map?我直接用jdom,dom4j操作不行吗? 如果你了解模板引擎(像velo ...
- Struts框架——(三)动态ActionForm
一.DynaActionForm的引入意义 使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便. 但是,ActionForm也存在一些明 ...
- 第一次将内容添加到azure event hubs
由于每秒数据吞吐量巨大,需要将实时数据存到event hubs,再由event hubs定时定量保存到document DB. event hubs的介绍详见微软官页:https://azure.mi ...