-
Notifications
You must be signed in to change notification settings - Fork 0
/
TianClient.cs
141 lines (127 loc) · 5.07 KB
/
TianClient.cs
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using System;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using TianYanCha.SDK.Extensions;
namespace TianYanCha.SDK
{
public class TianClient : ITianClient
{
private readonly HttpClient httpClient;
private readonly TianOptions options;
public TianClient(IHttpClientFactory httpClientFactory,
IOptions<TianOptions> options)
{
httpClient = httpClientFactory.CreateClient();
this.options = options.Value;
}
public async Task<TResponse> ExecuteAsync<TResponse>(IRequest<TResponse> request) where TResponse : TianResponse, new()
{
TResponse result;
try
{
var requestMessage = new HttpRequestMessage()
{
Method = request.GetHttpMethod(),
RequestUri = new Uri(GetRequestUri(request)),
Content = GetRequestContent(request),
};
if (!requestMessage.Headers.Contains("Authorization"))
requestMessage.Headers.Add("Authorization", options.Token);
var responseMessage = await httpClient.SendAsync(requestMessage);
var responseContent = await responseMessage.Content.ReadAsStringAsync();
result = JsonConvert.DeserializeObject<TResponse>(responseContent);
result.RequestUri = requestMessage.RequestUri.AbsoluteUri;
result.RequestBody = GetRequestBody(request);
result.StatusCode = responseMessage.StatusCode;
result.Headers = responseMessage.Headers;
result.ResponseBody = responseContent;
return result;
}
catch (Exception ex)
{
result = new TResponse
{
StatusCode = HttpStatusCode.BadRequest,
ResponseBody = ex.Message
};
return result;
}
}
public TResponse Execute<TResponse>(IRequest<TResponse> request) where TResponse : TianResponse, new()
{
TResponse result = null;
try
{
var requestMessage = new HttpRequestMessage()
{
Method = request.GetHttpMethod(),
RequestUri = new Uri(GetRequestUri(request)),
Content = GetRequestContent(request)
};
if (!requestMessage.Headers.Contains("Authorization"))
requestMessage.Headers.Add("Authorization", options.Token);
var responseMessage = httpClient.SendAsync(requestMessage).Result;
var responseContent = responseMessage.Content.ReadAsStringAsync().Result;
result = JsonConvert.DeserializeObject<TResponse>(responseContent);
result.RequestUri = requestMessage.RequestUri.AbsoluteUri;
result.RequestBody = GetRequestBody(request);
result.StatusCode = responseMessage.StatusCode;
result.Headers = responseMessage.Headers;
result.ResponseBody = responseContent;
return result;
}
catch (Exception ex)
{
result = new TResponse
{
StatusCode = HttpStatusCode.BadRequest,
ResponseBody = ex.Message
};
return result;
}
}
/// <summary>
/// 获取请求地址
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public string GetRequestUri(IRequest request)
{
if (request.GetHttpMethod() == HttpMethod.Get)
return options.BaseUrl + request.GetApiName() + "?" + request.GetParameters().ToSortQueryParameters();
else
return options.BaseUrl + request.GetApiName();
}
/// <summary>
/// 获取请求发送数据
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public string GetRequestBody(IRequest request)
{
if (request.GetHttpMethod() == HttpMethod.Get)
return request.GetParameters().ToSortQueryParameters();
else
return string.Empty;
}
/// <summary>
/// 获取请求发送的HttpContent.
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public virtual HttpContent GetRequestContent(IRequest request)
{
return (string.IsNullOrWhiteSpace(MediaType) || request.GetHttpMethod() == HttpMethod.Get)
? new StringContent(string.Empty)
: new StringContent(GetRequestBody(request), Encoding.UTF8, MediaType);
}
/// <summary>
/// 获取数据提交的MediaType
/// </summary>
public virtual string MediaType => "";
}
}