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方法中添加 ...
随机推荐
- TDI - Transport Driver Interface
[TDI - Transport Driver Interface] The Transport Driver Interface or TDI is the protocol understood ...
- Host 'XXX' is not allowed to connect to this MySQL server 解决方案/如何开启MySQL的远程帐号
www.cnblogs.com/zhangzhu/archive/2013/08/22/3274831.html 如何开启MySQL的远程帐号-1)首先以 root 帐户登陆 MySQL 在 Wind ...
- windows7内核驱动开发试验环境配置
首先配置环境参照这个: http://blog.csdn.net/qing666888/article/details/50858272 然后在win10里可能由于没有做测试签名因此一直没有成功加载驱 ...
- generator class 的含义
native有天生的,本土的,也就是说生来就有的, 那也就是说自动生成,不需要人工来帮忙或者管控的. 而assigned是指指定的,分配的, 如果你不赋予他甚麼东西,那麼他是不能实现的. 需要人工,自 ...
- Android开发学习---使用Intelij idea 13.1 进行android 开发
1.为什么放弃eclipse?太卡!! 实在受不了eclipse的卡了,运行WEB项目还好,但android开发实在太慢,太慢!经常卡死,CPU经常被占满! 看网上很多人都说比Intelij idea ...
- java 中 Math.rint()
Math.rint() **形参是 double System.out.println(Math.rint(2.5)); 返回 2.0 System.out.println(Math.rint(2.5 ...
- Codeforces 702C Cellular Network
题目:这里 题意:一条数轴上,有n个城市和m个塔,分别给出城市的位置和塔的位置,每个塔有个覆盖范围,问能将所有城市都覆盖的塔的最小范围是多少,一个城市只要被至少一个塔 覆盖就行. 可以利用贪心的思想模 ...
- prim
prim算法很难,但是我也把他写出来了.usaco3.1.1 #include <iostream> #include <cstring> using namespace st ...
- hihoCoder 1309:任务分配 贪心 优先队列
#1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, ...
- MJPhotoBrowser BUG修复
崩溃在loading.progress = (float)receivedSize/expectedSize; 分析:MJPhotoView 执行了hide移除了MJPhotoLoadingView, ...