RestSharp用法小结
今天有空,小结一下RestSharp的用法。
RestSharp内置了XML和JSON的反序列化(deserializers )。
- application/json – JsonDeserializer
- application/xml – XmlDeserializer
- text/json – JsonDeserializer
- text/xml – XmlDeserializer
- * – XmlDeserializer (all other content types not specified)
比如下面的实体类:
Public class Employee {
Public string EmployeeId {get; set ;}
Public int EmployeeName {get; set ;}
Public int EmployeeAge {get ; set ;}
}
对应的XML:
<Employee>
< EmployeeId >1< /EmployeeId >
< EmployeeName>John</ EmployeeName>
< EmployeeAge>30</ EmployeeAge>
<Employee>
对应的JSON:
{
EmployeeId:1
EmployeeName:”John”
EmployeeAge:30
}
1. 异步调用
client.ExecuteAsync(request, response => {
Console.WriteLine(response.Content);
});
2. 实现接口IRestAPIExecutor
using RestSharp;
using System;
using System.Threading.Tasks; namespace myCompany
{
public class RestAPIExecutor : IRestAPIExecutor
{
public string BaseUrl { get; set; } public string DefaultDateParameterFormat { get; set; } public IAuthenticator DefaultAuthenticator { get; set; } private RestClient client; public RestAPIExecutor(string CmsBaseURI, IAuthenticator Authenticator = null, string DateParameterFormat = null)
{
BaseUrl = CmsBaseURI;
DefaultAuthenticator = Authenticator; client = new RestClient(); if (DefaultAuthenticator != null)
client.Authenticator = DefaultAuthenticator; if (DateParameterFormat != null)
DefaultDateParameterFormat = DateParameterFormat; client.BaseUrl = BaseUrl;
} public T GenericExecute<T>(RestRequest request) where T : new()
{
request.DateFormat = string.IsNullOrEmpty(DefaultDateParameterFormat) ? "yyyy-MM-dd HH:mm:ss" : DefaultDateParameterFormat; var response = client.Execute<T>(request); if (response.ErrorException != null)
{
throw new RestCallException("Error retrieving response. Check inner details for more info.", response.ErrorException);
} return response.Data;
} public RestRequestAsyncHandle AsyncGenericExecute<T>(RestRequest request, Action<IRestResponse<T>> action) where T : new()
{
request.DateFormat = string.IsNullOrEmpty(DefaultDateParameterFormat) ? "yyyy-MM-dd HH:mm:ss" : DefaultDateParameterFormat;
return client.ExecuteAsync<T>(request, action);
} public Task<T> GetTaskAsync<T>(RestRequest request) where T : new()
{
request.DateFormat = string.IsNullOrEmpty(DefaultDateParameterFormat) ? "yyyy-MM-dd HH:mm:ss" : DefaultDateParameterFormat;
return client.GetTaskAsync<T>(request);
} public IRestResponse Execute(RestRequest request)
{
request.DateFormat = string.IsNullOrEmpty(DefaultDateParameterFormat) ? "yyyy-MM-dd HH:mm:ss" : DefaultDateParameterFormat; var response = client.Execute(request); if (response.ErrorException != null)
{
throw new RestCallException("Error retrieving response. Check inner details for more info.", response.ErrorException);
} return response;
} public byte[] DownloadData(RestRequest request)
{
return client.DownloadData(request);
} }
}
3. 实现自己的业务逻辑,包括
- HTTP GET,返回JSON,自动反序列化为实体类
- HTTP GET,获得返回的XML字符串,并转为XDocument
- 获得返回的http header里面的字段
- HTTP POST, 提交一个zip包
- HTTP GET, Partial download, 分段下载大的内容,可能包含很多个请求。最后还需要另外发一个请求获得整个文件的SHA码
using System.Xml.Linq;
using RestSharp;
using System;
using System.Configuration;
using System.IO;
using System.Linq; namespace myCompany
{
public class myClient
{
#region Initialization private readonly IRestAPIExecutor restAPIExecutor; public myClient()
{
restAPIExecutor = new RestAPIExecutor(ConfigurationManager.AppSettings[Utility.Constants.Configuration.CmsBaseUri],
DateParameterFormat: ConfigurationManager.AppSettings[Utility.Constants.Configuration.DateFormat]);
} public myClient(string CmsBaseURI, string dateFormat, string username = null, string password = null)
{
restAPIExecutor = !string.IsNullOrEmpty(username) ? new RestAPIExecutor(CmsBaseURI, DateParameterFormat: dateFormat, Authenticator: new HttpBasicAuthenticator(username, password)) : new RestAPIExecutor(CmsBaseURI, DateParameterFormat: dateFormat);
} #endregion //HTTP GET,返回JSON,自动反序列化为实体类
public OrderResult GetOrders(DateTime date, string channel = null, string merchant = null, string venue = null)
{
var request = new RestRequest(ConfigurationManager.AppSettings[Utility.Constants.Configuration.API_Campaign_List], Method.GET);
request.AddParameter("date", string.Format("{0:yyyy-MM-dd}", date));
if (!string.IsNullOrEmpty(channel)) request.AddParameter("channel", channel);
if (!string.IsNullOrEmpty(merchant)) request.AddParameter("merchant", merchant);
if (!string.IsNullOrEmpty(venue)) request.AddParameter("venue", venue); return restAPIExecutor.GenericExecute<OrderResult>(request);
} //HTTP GET,获得返回的XML字符串,并转为XDocument
public XDocument GetOrderDetailsXml(int OrderID)
{
var request = new RestRequest(ConfigurationManager.AppSettings[Utility.Constants.Configuration.API_Order_Details], Method.GET);
request.AddHeader(Application.AcceptHttpHeader, Application.AcceptHttpHeaderValue);
request.AddParameter("OrderID", OrderID.ToString(), ParameterType.UrlSegment);
var response = restAPIExecutor.Execute(request); //获得返回的http header里面的字段
//var sha = response.Headers.Where(s => s.Name == Application.SHAHttpHeader).Select(s => s.Value).FirstOrDefault(); return XDocument.Parse(response.Content);
} //HTTP POST, 提交一个zip包
public IRestResponse UploadZipFile(string fileName, byte[] fileContent)
{
var request = new RestRequest(ConfigurationManager.AppSettings[Utility.Constants.Configuration.API_POP_ZIP_Upload], Method.POST);
request.AddHeader("Content-Type", "application/zip");
request.AddParameter("filename", fileName);
request.AddFile("gzip", fileContent, fileName, "application/zip"); return restAPIExecutor.Execute(request);
} //HTTP GET, Partial download, 分段下载大的内容,可能包含很多个请求。最后还需要另外发一个请求获得整个文件的SHA码
public byte[] DownloadPartialOrderMedia()
{
var request = new RestRequest(ConfigurationManager.AppSettings[Utility.Constants.Configuration.API_POP_ZIP_Upload], Method.POST);
request.AddParameter("filename", fileName);
return restAPIExecutor.DownloadData(request);
} }
}
3. 异步读取RESTful API
var client = new RestClient("http://example.org");
var request = new RestRequest("product/42", Method.GET);
var content = await client.GetContentAsync(request);
扩展方法:
using System;
using System.Threading.Tasks;
using RestSharp; namespace RestSharpEx
{
public static class RestClientExtensions
{
private static Task<T> SelectAsync<T>(this RestClient client, IRestRequest request, Func<IRestResponse, T> selector)
{
var tcs = new TaskCompletionSource<T>();
var loginResponse = client.ExecuteAsync(request, r =>
{
if (r.ErrorException == null)
{
tcs.SetResult(selector(r));
}
else
{
tcs.SetException(r.ErrorException);
}
});
return tcs.Task;
} public static Task<string> GetContentAsync(this RestClient client, IRestRequest request)
{
return client.SelectAsync(request, r => r.Content);
} public static Task<IRestResponse> GetResponseAsync(this RestClient client, IRestRequest request)
{
return client.SelectAsync(request, r => r);
}
}
}
RestSharp用法小结的更多相关文章
- 转载:Hadoop排序工具用法小结
本文转载自Silhouette的文章,原文地址:http://www.dreamingfish123.info/?p=1102 Hadoop排序工具用法小结 发表于 2014 年 8 月 25 日 由 ...
- [No000010]Ruby 中一些百分号(%)的用法小结
#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...
- C++ typedef用法小结 (※不能不看※)
C++ typedef用法小结 (※不能不看※) 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不 ...
- 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)
函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...
- 1:CSS中一些@规则的用法小结 2: @media用法详解
第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下 at-rule ...
- 英语语法最终珍藏版笔记- 21it 用法小结
it 用法小结 it 在英语中的意思较多,用法较广,现总结如下. 一.it作句子的真正主语 1.it 指前面已经提到过的人或事物,有时指心目中的或成为问题的人或事物,作真正主语. 例如: What’s ...
- [转]ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...
- 结构体定义 typedef struct 用法详解和用法小结
typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,stru ...
- typedef用法小结
typedef用法小结- - 注意:本文转自网络,版权归原作者所有. typedef typedef用法小结- - 这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等 ...
随机推荐
- ubuntu修改文件访问权限
遇到“bash .....权限不够”的问题时, 从控制台进入到那个文件夹 chmod 777 * -R 全部子目录及文件权限改为 777
- (十)stm32中FSMC的使用(用于LCD)
FSMC全称“静态存储器控制器”. 使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线. (1)当存储数据设为8位时, ...
- 【读书笔记】读《JavaScript设计模式》之门面模式
一.前言 门面模式,也称Facade(外观)模式.核心的两点作用—— 1> 简化类的接口(让接口变得更加容易理解.容易应用.更加符合对应业务),来掩盖一个非常不同或者复杂的实现 2> 消除 ...
- 二、JavaScript语言--JS基础--JavaScript入门篇
1.如何插入JS 使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要成对出现,并把JavaScript代码写在<scri ...
- Linux使用tcpdump命令抓包保存pcap文件wireshark分析
[root@ok Desktop]# yum search tcpdump Loaded plugins: fastestmirror, refresh-packagekit, security Lo ...
- 百万用户时尚分享网站feed系统扩展实践
Fashiolista是一个在线的时尚交流网站,用户可以在上面建立自己的档案,和他人分享自己的以及在浏览网页时看到的时尚物品.目前,Fashiolista的用户来自于全球100多个国家,用户达百万级, ...
- IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html 有修改 Autofac通过Controller默认构造 ...
- Java Hour2
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为1 Hour,请各位不吝赐教. Hour2 检测字 ...
- Sql server之路 (六)上传服务器图片
原理: 上传图片的名字 插入到数据库里 上传图片的内容(二进制数据) 写到服务器指定的目录下 下次读取图片的时候 从数据库里的指定字段里读取图片文件名 从数据库的指定路径下 拼串成完成的路径 就可以下 ...
- java写入文件的几种方法分享
转自:http://www.jb51.net/article/47062.htm 一,FileWritter写入文件 FileWritter, 字符流写入字符到文件.默认情况下,它会使用新的内容取代所 ...