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简单扩展的更多相关文章

  1. 对bootstrap modal的简单扩展封装

    对bootstrap modal的简单扩展封装 参考自:http://www.muzilei.com/archives/677   注:原文不支持bootstrap新版本,并且居中等存在问题 此段时间 ...

  2. Log4net创建日志及简单扩展

    转:http://blog.csdn.net/CHENFEIYANG2009/article/details/5397342 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log ...

  3. 使用Log4net创建日志及简单扩展

    如何使用Log4net创建日志及简单扩展 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的 ...

  4. 由一道面试题简单扩展 — setTimeout、闭包

    在一个前端公众号,看到这么一个号称简单的面试题: 1.以下程序输出什么? <script type="text/javascript"> function init() ...

  5. asp.net mvc Htmlhelper简单扩展

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. C# AutoMapper的简单扩展

    AutoMapper可以很方便的将一个实体的属性值转化给另一个对象.这个功能在我们日常的编码中经常会遇到.我将AutoMapper的一些基本映射功能做成扩展方法,在编码中更方便使用. using Sy ...

  7. Enum的简单扩展

    1 添加一个描述的Attribute public enum MessageResult { [System.ComponentModel.Description("未通过")] ...

  8. 数据类型 简单扩展(Java)

    public class HelloWorld { public static void main(String[] args) { //整数拓展 进制 二进制0b 十进制 八进制0 十六进制0x i ...

  9. 如何使用Log4net创建日志及简单扩展

    第一步:在项目中添加对log4net.dll的引用,这里引用版本是1.2.10.0.第二步:程序启动时读取log4net的配置文件.如果是CS程序,在根目录的Program.cs中的Main方法中添加 ...

随机推荐

  1. BZOJ2038: [2009国家集训队]小Z的袜子(hose)

    Time Limit: 20 Sec  Memory Limit: 259 MB Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天, ...

  2. 3.struts2接收页面传参的三种方式

    Struts2通过拦截器机制封装了三种接收页面参数的方式: 1.属性驱动 2.模型驱动(有两种) Domain ModelDriven 1.属性驱动:这种方式比较简单,只要你直接在页面定义变量并且符合 ...

  3. python学习笔记4-redis multi watch实现锁库存

    python 关于redis的基本操作网上已经很多了,这里主要介绍点个人觉得有意思的内容1.redis的事务操作以及watch 乐观锁:后面描述2.tornado下异步使用redis的方式       ...

  4. 配置FastReport,FastReport报表加载不出来

    插件链接: Demo地址:http://pan.baidu.com/s/1dEXUvsP FastReport.Net软件地址:https://pan.baidu.com/s/1c2kNBVi     ...

  5. C#多线程实现方法

    C#中实现线程应用开发的类都包含在了System.Threading命名空间中,比较常用的是Thread,ThreadPool类 Thread类构造函数作用是创建线程,有两个重载版本,一个带参数,一个 ...

  6. 如何理解反向传播 Backpropagation 梯度下降算法要点

    http://colah.github.io/posts/2015-08-Backprop/ http://www.zhihu.com/question/27239198 待翻译 http://blo ...

  7. 【随笔】Photoshop简单切图

    一.首先准备一张需要切割的图: 二.打开Photoshop,在ps里打开这张图片: 三.在界面的左边选择切片工具: 四.根据需要,鼠标点住上方和左边的标尺拖动,给图片加上分割辅助线: 五.用切片工具点 ...

  8. JavaScript基础知识整理(2)

    15.处理图像 注意:(1)在写js文件时,尽量将函数的声明往后写,将函数调用写在前面,这样能够使代码结构很清晰. (2)一个网页中翻转器一般超过3个,所以使用for循环减少重复使用翻转器代码的次数. ...

  9. JavaScript 常用函数总结

    javascript函数:  ·常规函数  ·数组函数  ·日期函数  ·数学函数  ·字符串函数 .cookie函数 1.常规函数 javascript常规函数包括以下9个函数:  (1)alert ...

  10. 第五回. $e$ 的引入

    假如你有 $1$ 块钱, 存银行, 利率为 $100\%$, 那么一年后本息和为$$1+1=2.$$ 如果你换种存法, 存半年, 把本息和取出来, 再存半年, 那么一年后本息和为$$\left(1+\ ...