首页 > 其他分享 >使用RestSharp 库消费Restful Service

使用RestSharp 库消费Restful Service

时间:2022-10-24 16:01:12浏览次数:94  
标签:string Service request AddParameter var RestSharp Restful

本文向你推荐一个开源的库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的,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),可以很好的加速你的应用的开发。


标签:string,Service,request,AddParameter,var,RestSharp,Restful
From: https://blog.51cto.com/shanyou/5790073

相关文章

  • consul报错:Consul service ids must not be empty, must start with a letter 或 Unab
      报类似错误,一般是配置文件没生效或配置有问题造成的,可能是resource目录,没有标记为根目录,解决方法如下: ......
  • k8s之service yaml
    kind:Service#类型为serviceapiVersion:v1#serviceAPI版本,service.apiVersionmetadata:#定义service元数据,service.metadatalabels:#自定义标签,service.metadata.......
  • kubernetes Service
    Service介绍运行于pod中的容器化应用绝大多数是服务类的守护进程,它们受控于控制器资源对象,在自愿或非自愿中断后只能由重构的、具有相同功能的新pod对象所取代,属于非可再生......
  • Restful 风格的接口简介
    本文对Restful风格的接口做一个简单的陈述,纯属个人理解。 最直观的印象是,在Restful风格中,尽管请求的url一致,但是请求方式不一致会调用不同的接口。四种请求方......
  • 安卓中实现异步任务(5)——使用IntentService实现
    安卓中实现异步任务(5)——使用IntentService实现问题背景上篇文章大致介绍了几种安卓汇总实现异步任务的方法,讲得比较简要,有朋友问到具体的实现方式,现在开始分列几篇文章详......
  • 使用 ServiceWorker 提高性能
    ​​serviceworker​​​ 是一种在独立的处理线程上执行后台任务的worker,允许用户拦截网络请求并有条件地将其存储在称为 ​​CacheStorageAPI​​​ 的特殊缓存中,此......
  • 从 Service 中启动 Activity 以及手机截屏
    关于android截屏,在Service中实现后台截屏记得上一次写android代码可能在十年前了,那时用的是eclipse开发,现在全忘记了。这次用androidstudio捣鼓快一周时间,才......
  • Golang-Gin Response 统一返回restful格式的数据
    目的:gin返回restful格式的数据,返回的200,201的数据也包括异常时的404/500等情况直接调用即可packageresponseimport( "github.com/gin-gonic/gin" "net/http")......
  • VS 2008 附加到进程测试 WIndow Service
    前提条件:首先安装windowservice 接受项目的时候,已经装好了不过还是贴一下安装步骤:https://www.jb51.net/article/238742.htm准备测试1.把项目编译一下,在项目所......
  • 如何强制swarm集群中的service进行负载再均衡?
    这个题目是不是很奇怪,没错!所谓的负载再平衡,指的是:当集群新加入某个节点,或者某个节点由于异常离开集群,之后又加回到集群的情况。 很显然,这些新的节点上是不会有负载的,也......