【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 ...
随机推荐
- 前端开发入门到进阶第三集【js进行url解析】
https://www.cnblogs.com/yuanzhiguo/p/8241644.html
- CSAPP:bomblab
BOMBLAB实验总结 CSAPP实验BOMB,很头疼,看不懂,勉强做完了. 答案是这样的: Border relations with Canada have never been better. ...
- 【洛谷P2623物品选取】动态规划
分析 各种背包弄在一起. AC代码 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; #def ...
- 【洛谷P2028 龙兄摘苹果】动态规划
分析 第二类striling数 考虑最后一个数到底是放在之前的任意一个集合内,还是自成一个集合 \[F_{i\ j}=F_{i-1\ j-1}+j\times F_{i-1,j} \] AC代码 #i ...
- Java键盘获取数据
java录入键盘数据,整型.浮点型.布尔型.字符串. 通过导入java.util.Scanner实现各类操作 import java.util.Scanner;//导入包 public class H ...
- 新一代垃圾回收器ZGC的探索与实践
ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括: 停顿时间不超过10ms: 停顿时间不会随着堆的大小,或者活跃对象的大小而增加: ...
- UI自动化学习笔记- 日志相关操作
一.日志相关 1.日志 概念:日志就是用于记录系统运行时的信息,对一个事件的记录,也称log 1.1 日志的作用 调试程序 了解系统程序运行的情况,是否正常 系统程序运行故障分析与问题定位 用来做用户 ...
- 实战 | Hive 数据倾斜问题定位排查及解决
Hive 数据倾斜怎么发现,怎么定位,怎么解决 多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例.当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措 ...
- Jarvis OJ部分逆向
Jarvis OJ部分逆向题解 很久没有写博客了,前天上Jarvis OJ刷了几道逆向,保持了一下感觉.都是简单题目,写个writeup记录一下. easycrackme int __cdecl ma ...
- MySQL 事务、日志、锁、索引学习总结,
MySQL架构 MySQL可分为Server和存储引擎两部分,如图1所示. Server层:包括客户端连接器.查询缓存.解析/预处理器.优化器.执行器等,以及MySQL内置函数和所有跨引擎的功能都在这 ...