使用RestSharp 库消费Restful Service

 

现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流。.NET/Mono下如何消费Restful Service呢,再也没有了方便的Visual Studio的方便生产代理的工具了,你还在用HttpWebRequest 自己封装吗?Restful Service还有授权问题,自己写出来的代码是不是很不优雅?通常Restful Service返回的数据格式是XML或者Json,还要设置服务的输入参数等等,使用起来很复杂。本文向你推荐一个开源的库RestSharp轻松消费Restful Service。RestSharp是一个开源的.NET平台下REST和Http API的客户端库,支持的平台有.NET 3.5/4、Mono、Mono for Android、MonoTouch、Windows Phone 7.1 Mango。他可以简化我们访问Restful服务,可以到这里下载代码 https://github.com/johnsheehan/RestSharp/archives/master 更简单的使用NuGet。RestSharp使用Json.Net处理 Json数据同Poco对象的序列化。

下面分别从库的使用方式上进行介绍,使用的Restful Service是腾讯社区开放平台(http://opensns.qq.com/)。 
1、服务认证,RestSharp定义了一个认证授权的接口 IAuthenticator ,有NtlmAuthenticator、HttpBasicAuthenticator、OAuth1Authenticator、OAuth2Authenticator几种,基本上可以满足要求了,腾讯社区开放平台使用OAuth2,腾讯社区开放平台额外增加了一个OpenId的参数,我们从OAuth2Authenticator的基类继承实现一个:

public class OAuthUriQueryParameterAuthenticator : OAuth2Authenticator 
    { 
        private readonly string openId; 
        private readonly string consumerKey;

public OAuthUriQueryParameterAuthenticator(string openId, string accessToken, string consumerkey) 
            :base(accessToken) 
        { 
            this.openId = openId; 
            this.consumerKey = consumerkey; 
        }

public override void Authenticate(IRestClient client, IRestRequest request) 
        { 
            request.AddParameter("access_token", AccessToken, ParameterType.GetOrPost); 
            request.AddParameter("openid", openId, ParameterType.GetOrPost); 
            request.AddParameter("oauth_consumer_key", consumerKey, ParameterType.GetOrPost); 
        }

2、Get请求方法,下面的例子是根据access_token获得对应用户身份的openid: https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN

public string GetOpenId(string accessToken) 
      {

RestClient  _restClient = new RestClient(Endpoints.ApiBaseUrl); 
          var request = _requestHelper.CreateOpenIDRequest(accessToken); 
          var response = Execute(request); 
          var openid = GetUserOpenId(response.Content); 
          return openid; 
      }

private RestSharp.RestResponse Execute(RestRequest request) 
       {

//返回的结果

var response = _restClient.Execute(request);

if (response.StatusCode != HttpStatusCode.OK) 
           { 
               throw new QzoneException(response); 
           } 
           return response; 
       }

internal RestRequest CreateOpenIDRequest(string accesstoken) 
       { 
           var request = new RestRequest(Method.GET); 
           request.Resource = "oauth2.0/me?access_token={accesstoken}"; 
           request.AddParameter("accesstoken", accesstoken, ParameterType.UrlSegment); 
           return request; 
       }

上面代码里涉及到了服务的输入参数通过AddParameter方法很方便的处理,是不是很简单。

3、POST请求服务,下面的例子是发表一条微博信息(纯文本)到腾讯微博平台上http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91add_t

/// <summary> 
        /// 发表一条微博信息(纯文本)到腾讯微博平台上 
        /// </summary> 
        /// <param name="content">表示要发表的微博内容。必须为UTF-8编码,最长为140个汉字,也就是420字节。 
        /// 如果微博内容中有URL,后台会自动将该URL转换为短URL,每个URL折算成11个字节。</param> 
        /// <param name="clientip">用户ip,以分析用户所在地</param> 
        /// <param name="jing">用户所在地理位置的经度。为实数,最多支持10位有效数字。有效范围:-180.0到+180.0,+表示东经,默认为0.0</param> 
        /// <param name="wei">用户所在地理位置的纬度。为实数,最多支持10位有效数字。有效范围:-90.0到+90.0,+表示北纬,默认为0.0。</param> 
        /// <param name="syncflag">标识是否将发布的微博同步到QQ空间(0:同步; 1:不同步;),默认为0.</param> 
        /// <returns></returns> 
        internal AddWeiboResult AddWeibo(string content, string clientip = "", string jing = "", string wei = "", int syncflag = 0) 
        {

RestClient  _restClient = new RestClient(Endpoints.ApiBaseUrl);

_restClient.Authenticator = new OAuthUriQueryParameterAuthenticator(context.AccessToken.OpenId, context.AccessToken.AccessToken, context.Config.GetAppKey()); 
            var request = _requestHelper.CreateAddWeiboRequest(content, clientip,jing,wei,syncflag);

var response = Execute(request);            
            var payload = Deserialize<AddWeiboResult>(response.Content); 
            return payload; 
        }

internal RestRequest CreateAddWeiboRequest(string content, string clientip, string jing, string wei, int syncflag) 
        { 
            var request = new RestRequest(Method.POST); 
            request.RequestFormat = DataFormat.Json; 
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); 
            request.Resource = "t/add_t"; 
            request.AddParameter("content", content); 
            if (!string.IsNullOrEmpty(clientip)) 
            { 
                request.AddParameter("clientip", clientip); 
            } 
            if (!string.IsNullOrEmpty(jing)) 
            { 
                request.AddParameter("jing", jing); 
            } 
            if (!string.IsNullOrEmpty(wei)) 
            { 
                request.AddParameter("wei", wei); 
            } 
            request.AddParameter("syncflag", syncflag); 
            return request; 
        }

这个方法需要使用到OAuth2的认证和前面的不需要认证的接口比较起来并没有变复杂,代码很优雅。

4、来点复杂的,发个图片微博,RestSharp对HttpFile的封装也很不错,使用起来一样很简单,看代码中的红色部分:

internal RestRequest CreateAddPictureWeiboRequest(string content, string clientip, string jing, string wei, int syncflag, string fileName, byte[] bytes) 
       { 
           var request = new RestRequest(Method.POST); 
           request.RequestFormat = DataFormat.Json; 
           var boundary = string.Concat("--", Util.GenerateRndNonce()); 
           request.AddHeader("Content-Type", string.Concat("multipart/form-data; boundary=", boundary)); 
           request.Resource = "t/add_pic_t"; 
           request.AddParameter("content", content); 
           if (!string.IsNullOrEmpty(clientip)) 
           { 
               request.AddParameter("clientip", clientip); 
           } 
           if (!string.IsNullOrEmpty(jing)) 
           { 
               request.AddParameter("jing", jing); 
           } 
           if (!string.IsNullOrEmpty(wei)) 
           { 
               request.AddParameter("wei", wei); 
           } 
           request.AddParameter("syncflag", syncflag); 
           request.AddFile("pic", bytes, fileName); 
           return request; 
       }

上面这几个API的调用已经很具有代表性了,是不是可以很好的简化你使用Restful Service,记住DRY(don’t repeat yourself),可以很好的加速你的应用的开发。

Consuming ASP.NET Web API with RestSharp

【转自】http://www.cnblogs.com/shanyou/archive/2012/01/27/RestSharp.html

【REST】使用RestSharp 库消费Restful Service的更多相关文章

  1. 开源的库RestSharp轻松消费Restful Service

    现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流..NET/Mono下如何消费Restful Service呢,再也没有了方便的Visual Studio的方便生产代理 ...

  2. 测试必须学spring RESTful Service(上)

    文末我会说说为什么测试必须学spring. REST REST,是指REpresentational State Transfer,有个精辟的解释什么是RESTful, 看url就知道要什么 看met ...

  3. spring如何创建RESTful Service

    REST REST,是指REpresentational State Transfer,有个精辟的解释什么是RESTful, 看url就知道要什么 看method就知道干什么 看status code ...

  4. 在IIS8.5的环境下配置WCF的Restful Service

    今天在客户的环境中(Windows Server 2012 R2 + IIS 8.5)搭建Call WCF Restful Service的功能,发现了几个环境配置的问题,记录如下: 1):此环境先安 ...

  5. 使用spring boot+mybatis+mysql 构建RESTful Service

    开发目标 开发两个RESTful Service Method Url Description GET /article/findAll POST /article/insert 主要使用到的技术 j ...

  6. JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例

    RESTFul Service中如果要注入EJB实例,常规的@Inject将不起作用,在Jboss中,应用甚至都启动不起来(因为@Inject注入失败),解决方法很简单:将@Inject换成@EJB ...

  7. JAVA格物致知基础篇:用JAX-RS和Jersey打造RESTful Service

    随着服务器的处理能力越来越强,业务需求量的不断累积,越来越多的公司开始从单一服务器,单一业务承载变成了多服务器,多业务承载的快速扩展的过程中.传统的方法很难满足和应付这种业务量的增长和部署方式的改变. ...

  8. 构建基于WCF Restful Service的服务

    前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面的Dynamic Proxy,但是没有这种方式简便), ...

  9. 基于.Net FrameWork的 RestFul Service

    关于本文 这篇文章的目的就是向大家阐述如何在.net framework 4.0中创建RestFul Service并且使用它. 什么是web Services,什么是WCF 首先讲到的是web Se ...

随机推荐

  1. IO编程之File类

    File类是java.io包下代表与平台无关的文件及目录,程序操作文件和目录都可以通过File类来完成.值得指出的是,不管是文件还是目录都可以通过File类来操作.File能新建.删除.重命名文件和目 ...

  2. 使用jquery的on方法注册事件遇到的坑

    1,使用on注册事件 $(selector).on(event,childSelector,data,function) 2,$(selector)中的selector可以是document,那么意味 ...

  3. Web的工作原理(二)

    1.工作过程:如下图所示描述了Web的工作原理. (1) 用户打开计算机(客户机),启动浏览器程序,并在浏览器中指定一个URL(Uniform Resource Locator,统一资源定位器),浏览 ...

  4. SSM框架中mapper层,增删改查,如何实现

    1.批量修改 <!-- 批量修改 MySQL--> <update id="updateBatch" parameterType="java.lang. ...

  5. Odoo的附件大小限制

    Odoo使用binary类型来保存附件数据,可以直接支持附件数据的上传.但是在实际使用中,有可能遇到附件文件大小超过限制的情况,如下图: 但是ERP定制过程中难免会遇到客户确实需要上传超大附件,那么怎 ...

  6. 有语言基础的人应该如何学习python?

    正好最近在学python,感觉有语言基础的话更多在乎一些语法糖,毕竟其他东西在之前应该接触过了. 笔者C++是起始语言,也接触过java.js,介绍一点python的特点吧.帮助自己巩固所学,也希望能 ...

  7. python虚拟环境之Pyenv

    一.windows下安装 1.使用命令安装 pip install pyenv-win --target %USERPROFILE%/.pyenv %USERPROFILE%/是具体的路径,例如 ## ...

  8. ondblclick="return showCodeList 分析思路

    <Div id="divApproveRejectReasonInput" style="display:none"><input class ...

  9. 等Excel工作簿关闭后自动加密压缩备份

    ;; 等Excel工作簿关闭后自动加密压缩备份.ahk;; 腾讯QQ号 595076941; 作者:boai; 写作日期:2019年5月15日; 版本号:第1版; 手机号(中国移动) 138##### ...

  10. 1.9 货仓选址问题——Python

    题目描述 在一条数轴上有 N 家商店,它们的坐标分别为 A1~AN. 现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品. 为了提高效率,求把货仓建在何处,可以使得货仓到每家商店 ...