今天有空,小结一下RestSharp的用法。可能通过 nuget 进行安装。
RestSharp内置了XML和JSON的反序列化(deserializers )。
- application/json – JsonDeserializer
- application/xml – XmlDeserializer
- text/json – JsonDeserializer
- text/xml – XmlDeserializer
- * – XmlDeserializer (all other content types not specified)
比如下面的实体类:
1
2
3
4
5
|
Public
class
Employee {
Public
string
EmployeeId {
get
;
set
;}
Public
int
EmployeeName {
get
;
set
;}
Public
int
EmployeeAge {
get
;
set
;}
}
|
对应的XML:
1
2
3
4
5
|
<
Employee
>
<
EmployeeId
>1< /
EmployeeId
>
<
EmployeeName
>John</
EmployeeName
>
<
EmployeeAge
>30</
EmployeeAge
>
<
Employee
>
|
对应的JSON:
1
2
3
4
5
|
{
EmployeeId:1
EmployeeName:”John”
EmployeeAge:30
}
|
1. 异步调用
1
2
3
|
client.ExecuteAsync(request, response => {
Console.WriteLine(response.Content);
});
|
2. 实现接口IRestAPIExecutor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
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码
3. 异步读取RESTful API
1
2
3
|
var
request =
new
RestRequest(
"product/42"
, Method.GET);
var
content = await client.GetContentAsync(request);
|
扩展方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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);
}
}
}
|