使用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. Docker与k8s的恩怨情仇(五)——Kubernetes的创新

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上节中我们提到了社区生态的发展使得Kubernetes得到了良性的发展和传播.比起相对封闭的Docker社区 ...

  2. 【记录】如何造一个vite插件(2)

    上一篇已经把vite插件的基础结构搭建起来了,这一次就来聊聊继续完善开发环境. 完善开发环境 生成d.ts文件 先来修改一下lib/index.ts这个文件 export interface user ...

  3. Day11继承、封装、多态-面向对象编程(2)

    封装 我们设计程序要追求 高内聚,低耦合 . 高内聚:类的内部数据操作细节自己完成,不允许外部干涉 低耦合:仅暴露少量方法给外部使用 封装(数据的隐藏) 通常,应禁止直接访问一个对象中数据的实际表示, ...

  4. Day7 break continue goto 以及打印三角形练习.

    break break在任何循环语句中的主体部分,均可以用break控制循环流程.break用于强行退出循环,不执行循环中剩余的语句. (break语句也在switch中使用) package com ...

  5. vue 快速入门 系列 —— vue loader 扩展

    其他章节请看: vue 快速入门 系列 vue loader 扩展 在vue loader一文中,我们学会了从零搭建一个简单的,用于单文件组件开发的脚手架.本篇将在此基础上继续引入一些常用的库:vue ...

  6. mac设置终端命令行别名alias(git、npm)

    别名(alias)通常被用作对一串或单个命令的简称.懒人必备!当常用到命令行操作的时候,每次输入一长串命令,不厌其烦,自然想到了用简称代替.这里主要介绍两种mac设置别名alias的方式. mac 设 ...

  7. python3执行.sql文件

    这个脚本主要是遍历执行文件夹下的sql文件,但是没有辨别文件的格式,所以文件夹下只能够放.sql文件,否则会报错哈. 我的sql文件夹与执行的文件平级,所以dir_path就是sql,大家依照自己的路 ...

  8. python编写DDoS攻击脚本

    python编写DDoS攻击脚本 一.什么是DDoS攻击 DDoS攻击就是分布式的拒绝服务攻击,DDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击方式.单一的DoS攻击一般是采用一对一方式的, ...

  9. 建立安全SSL连接PostgreSQL数据库服务器

    建立安全SSL连接PostgreSQL数据库服务器当前物联网的挑战之一就是提供最高的安全级别.这就是为什么需要开启SSL连接到 PostgreSQL. 当你想要安全的存储数据到PostgreSQL数据 ...

  10. Android面试6家一线大厂,这个问题是必问!

    年后面了六家大厂,每家都会问的一个问题就是Android的消息机制!可见Android的消息机制是多么重要! 消息机制之所以这么重要是因为Android应用程序是通过消息来驱动的,Android某种意 ...