使用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. java面向对象程序设计(下)-接口的定义

    抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...

  2. 【译】.NET 对象分配工具

    随着 Visual Studio 16.10 的发布,性能分析器又有了一个新的分析引擎,.NET 对象分配工具是第一个加入的工具.这为该工具提供了一些新特性,并显著提高了 perf 性能.在你的 C# ...

  3. 算法leetcode_分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...

  4. 谷粒商城--分布式基础篇P28~P101(完结)

    谷粒商城--分布式基础篇P28~P101(完结) 前面1-27节主要是环境配置特别难,后面的28~101节主要是前端编写的代码较多以及后台的CRUD操作比较多.因为内容很多,所以我是根据自己想学的点进 ...

  5. Java规范的三种注释方式:

    1.单行注释 // //单行注释 2.多行注释 /* */ /* 多行 注释 */ 3.文档注释[java特有的] /** */ ◆注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文 ...

  6. jvm源码解读--06 Method 方法解析

    进入 // Methods bool has_final_method = false; AccessFlags promoted_flags; promoted_flags.set_flags(0) ...

  7. maven 工程构建 之_____<dependencyManagement>标签

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  8. IDEA使用Tomcat时控制台乱码的解决方案>从零开始学JAVA系列

    IDEA使用Tomcat时控制台乱码的解决方案 解决方案1,修改启动时虚拟机参数 解决方案2,修改idea的设置 解决方案3,修改idea配置文件 在最后添加一行 '-Dfile.encoding=U ...

  9. pytest框架fixture的使用

    fixture可以当做参数传入 定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要以test开头,跟用例区分开.fixtu ...

  10. MobSF移动安全扫描平台本地化部署与简单汉化

    在之前的文章MobSF移动安全扫描平台环境搭建与试用中,我们用docker进行了搭建,那么我们如何在本地直接搭建呢,其实也是很简单的. 本地化部署 我们在本地安装 其实是很简单的,里面有两个文件,在不 ...