【REST】使用RestSharp 库消费Restful Service
使用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的更多相关文章
- 开源的库RestSharp轻松消费Restful Service
现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流..NET/Mono下如何消费Restful Service呢,再也没有了方便的Visual Studio的方便生产代理 ...
- 测试必须学spring RESTful Service(上)
文末我会说说为什么测试必须学spring. REST REST,是指REpresentational State Transfer,有个精辟的解释什么是RESTful, 看url就知道要什么 看met ...
- spring如何创建RESTful Service
REST REST,是指REpresentational State Transfer,有个精辟的解释什么是RESTful, 看url就知道要什么 看method就知道干什么 看status code ...
- 在IIS8.5的环境下配置WCF的Restful Service
今天在客户的环境中(Windows Server 2012 R2 + IIS 8.5)搭建Call WCF Restful Service的功能,发现了几个环境配置的问题,记录如下: 1):此环境先安 ...
- 使用spring boot+mybatis+mysql 构建RESTful Service
开发目标 开发两个RESTful Service Method Url Description GET /article/findAll POST /article/insert 主要使用到的技术 j ...
- JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例
RESTFul Service中如果要注入EJB实例,常规的@Inject将不起作用,在Jboss中,应用甚至都启动不起来(因为@Inject注入失败),解决方法很简单:将@Inject换成@EJB ...
- JAVA格物致知基础篇:用JAX-RS和Jersey打造RESTful Service
随着服务器的处理能力越来越强,业务需求量的不断累积,越来越多的公司开始从单一服务器,单一业务承载变成了多服务器,多业务承载的快速扩展的过程中.传统的方法很难满足和应付这种业务量的增长和部署方式的改变. ...
- 构建基于WCF Restful Service的服务
前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面的Dynamic Proxy,但是没有这种方式简便), ...
- 基于.Net FrameWork的 RestFul Service
关于本文 这篇文章的目的就是向大家阐述如何在.net framework 4.0中创建RestFul Service并且使用它. 什么是web Services,什么是WCF 首先讲到的是web Se ...
随机推荐
- [刘阳Java]_第一个Java程序_第7讲
1. 其实第一个Java程序是很简单,但是当自己编写第一个Java程序时候需要注意如下几个内容: 理解Java程序的运行环境 校验你的Java环境变量是否能够运行你所写的第一个Java程序 理解Jav ...
- Python + Requests 知识点回顾
http://www.downza.cn/soft/11145.html PS下载地址 http://www.bejson.com/jsonviewernew/ JSON的在线视图 import re ...
- 微信小程序云开发-云存储的应用-识别身份证(正面和反面)
一.准备工作 1.创建云函数identify 2.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...
- 第三十二篇 -- CreateFile、ReadFile、WriteFile
一.CreateFile 这是一个多功能的函数,可打开或创建文件或者I/O设备,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道. 函数原型: HANDLE WIN ...
- videojs文档翻译Guides-Plugins
Video.js Plugins Video.js的一大优势在于其插件生态系统,允许来自世界各地的作者分享他们的视频播放器定制.这包括从最简单的UI调整到新的播放技术和资源处理程序的一切! 因为我们将 ...
- java继承基础详解
java继承基础详解 继承是一种由已存在的类型创建一个或多个子类的机制,即在现有类的基础上构建子类. 在java中使用关键字extends表示继承关系. 基本语法结构: 访问控制符 class 子类名 ...
- 最高级的AutoHotkey重试源代码结构20191221.docx
;; 最高级的AutoHotkey重试源代码结构20191221.docx;; 在编写AutoHotkey脚本时经常要用到重试,; 单击控件无效时需要重新再单击,; 发送模拟按键无效时需要重新发送.; ...
- LeetCode通关:数组十七连,真是不简单
分门别类刷算法,坚持,进步! 刷题路线参考:https://github.com/chefyuan/algorithm-base https://github.com/youngyangy ...
- ORACLE ORA-00933: SQL 命令未正确结束,
这个错误害我花了一天时间排查,最后原来是因为结束符,这种语句不能是分号,将分号即可执行成功. MERGE INTO MO_TRADE_COUNT_DAY A USING ( SELECT MAX(fl ...
- iptables中实现内外网互访,SNAT和DNAT
目录 一.SNAT原理与应用 二.DNAT原理与应用 DNAT转换:发布内网web服务 DNAT转换:发布时修改目标端口 三.防火墙规则的备份和还原 四.linux抓包 一.SNAT原理与应用 ① S ...