You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
9.9 KiB
239 lines
9.9 KiB
using BBWYB.Common.Http;
|
|
using com.alibaba.openapi.client.entity;
|
|
using com.alibaba.openapi.client.policy;
|
|
using com.alibaba.openapi.client.serialize;
|
|
using com.alibaba.openapi.client.util;
|
|
using Newtonsoft.Json.Linq;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Web;
|
|
|
|
namespace com.alibaba.openapi.client.http
|
|
{
|
|
public class HttpClient
|
|
{
|
|
private ClientPolicy clientPolicy;
|
|
private RestApiService restApiService;
|
|
private IDictionary<string, string> requestHeader;
|
|
|
|
public HttpClient(ClientPolicy clientPolicy)
|
|
{
|
|
this.clientPolicy = clientPolicy;
|
|
}
|
|
|
|
public HttpClient(ClientPolicy clientPolicy, RestApiService restApiService)
|
|
{
|
|
this.clientPolicy = clientPolicy;
|
|
this.restApiService = restApiService;
|
|
this.requestHeader = new Dictionary<string, string>()
|
|
{
|
|
{ "User-Agent","Ocean/NET-SDKClient"}
|
|
};
|
|
}
|
|
|
|
public JObject NewRequest(Request request, RequestPolicy requestPolicy)
|
|
{
|
|
StringBuilder path = createProtocolRequestPath(requestPolicy, request);
|
|
Dictionary<string, object> parameters = createParameterDictionary(requestPolicy, request);
|
|
signature(path.ToString(), parameters, requestPolicy, clientPolicy);
|
|
string paramString = createParameterStr(parameters);
|
|
Uri uri = new Uri(buildRequestUri(requestPolicy, request));
|
|
|
|
var result = restApiService.SendRequest($"{uri.Scheme}://{uri.Host}",
|
|
uri.LocalPath,
|
|
paramString,
|
|
requestHeader,
|
|
requestPolicy.HttpMethod.Equals("GET") ? HttpMethod.Get : HttpMethod.Post,
|
|
RestApiService.ContentType_Form);
|
|
if (result.StatusCode != HttpStatusCode.OK)
|
|
throw new Exception(result.Content.ToString());
|
|
return JObject.Parse(result.Content);
|
|
}
|
|
|
|
public T request<T>(Request request, RequestPolicy requestPolicy)
|
|
{
|
|
StringBuilder path = createProtocolRequestPath(requestPolicy, request);
|
|
Dictionary<String, Object> parameters = createParameterDictionary(requestPolicy, request);
|
|
StringBuilder queryBuilder = new StringBuilder();
|
|
signature(path.ToString(), parameters, requestPolicy, clientPolicy);
|
|
if ("GET".Equals(requestPolicy.HttpMethod))
|
|
{
|
|
|
|
String queryString = createParameterStr(parameters);
|
|
String uriStr = buildRequestUri(requestPolicy, request);
|
|
uriStr = uriStr + "?" + queryString;
|
|
Uri uri = new Uri(uriStr);
|
|
HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest;
|
|
|
|
httpWebRequest.Method = "GET";
|
|
httpWebRequest.KeepAlive = false;
|
|
httpWebRequest.AllowAutoRedirect = true;
|
|
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
|
|
httpWebRequest.UserAgent = "Ocean/NET-SDKClient";
|
|
|
|
HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse;
|
|
Stream responseStream = response.GetResponseStream();
|
|
|
|
DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol);
|
|
ResponseWrapper rw = deSerializer.deSerialize(responseStream, typeof(T), Encoding.UTF8.EncodingName);
|
|
return (T)rw.Result;
|
|
}
|
|
else
|
|
{
|
|
String postString = createParameterStr(parameters);
|
|
byte[] postData = Encoding.UTF8.GetBytes(postString);
|
|
String uriStr = buildRequestUri(requestPolicy, request);
|
|
Uri uri = new Uri(uriStr);
|
|
HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest;
|
|
|
|
httpWebRequest.Method = "POST";
|
|
httpWebRequest.KeepAlive = false;
|
|
httpWebRequest.AllowAutoRedirect = true;
|
|
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
|
|
httpWebRequest.UserAgent = "Ocean/NET-SDKClient";
|
|
httpWebRequest.ContentLength = postData.Length;
|
|
|
|
System.IO.Stream outputStream = httpWebRequest.GetRequestStream();
|
|
outputStream.Write(postData, 0, postData.Length);
|
|
outputStream.Close();
|
|
try
|
|
{
|
|
HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse;
|
|
Stream responseStream = response.GetResponseStream();
|
|
|
|
|
|
DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol);
|
|
ResponseWrapper rw = deSerializer.deSerialize(responseStream, typeof(T), Encoding.UTF8.EncodingName);
|
|
return (T)rw.Result;
|
|
}
|
|
catch (System.Net.WebException webException)
|
|
{
|
|
HttpWebResponse response = webException.Response as HttpWebResponse;
|
|
Stream responseStream = response.GetResponseStream();
|
|
DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol);
|
|
Exception rw = deSerializer.buildException(responseStream, 500, Encoding.UTF8.EncodingName);
|
|
throw rw;
|
|
}
|
|
}
|
|
}
|
|
|
|
private String buildRequestUri(RequestPolicy requestPolicy, Request request)
|
|
{
|
|
String schema = "http";
|
|
int port = clientPolicy.HttpPort;
|
|
if (requestPolicy.UseHttps)
|
|
{
|
|
schema = "https";
|
|
port = clientPolicy.HttpsPort;
|
|
}
|
|
StringBuilder relativeBuilder = new StringBuilder(schema);
|
|
relativeBuilder.Append("://");
|
|
relativeBuilder.Append(clientPolicy.ServerHost);
|
|
if (port != 80 && port != 443)
|
|
{
|
|
relativeBuilder.Append(":");
|
|
relativeBuilder.Append(port);
|
|
}
|
|
|
|
if (requestPolicy.AccessPrivateApi)
|
|
{
|
|
relativeBuilder.Append("/api");
|
|
}
|
|
else
|
|
{
|
|
relativeBuilder.Append("/openapi");
|
|
}
|
|
|
|
relativeBuilder.Append("/");
|
|
relativeBuilder.Append(createProtocolRequestPath(requestPolicy, request));
|
|
return relativeBuilder.ToString();
|
|
}
|
|
|
|
private StringBuilder createProtocolRequestPath(RequestPolicy requestPolicy, Request request)
|
|
{
|
|
|
|
StringBuilder relativeBuilder = new StringBuilder();
|
|
|
|
relativeBuilder.Append(requestPolicy.RequestProtocol);
|
|
relativeBuilder.Append("/").Append(request.ApiId.Version);
|
|
relativeBuilder.Append("/").Append(request.ApiId.NamespaceValue);
|
|
relativeBuilder.Append("/").Append(request.ApiId.Name);
|
|
relativeBuilder.Append("/").Append(clientPolicy.AppKey);
|
|
return relativeBuilder;
|
|
|
|
}
|
|
|
|
private String createParameterStr(Dictionary<String, Object> parameters)
|
|
{
|
|
StringBuilder paramBuilder = new StringBuilder();
|
|
foreach (KeyValuePair<string, object> kvp in parameters)
|
|
{
|
|
String encodedValue = null;
|
|
if (kvp.Value != null)
|
|
{
|
|
String tempValue = kvp.Value.ToString();
|
|
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(tempValue);
|
|
encodedValue = HttpUtility.UrlEncode(byteArray, 0, byteArray.Length);
|
|
}
|
|
paramBuilder.Append(kvp.Key).Append("=").Append(encodedValue);
|
|
paramBuilder.Append("&");
|
|
}
|
|
return paramBuilder.ToString();
|
|
}
|
|
|
|
private Dictionary<String, Object> createParameterDictionary(RequestPolicy requestPolicy, Request request)
|
|
{
|
|
|
|
Serializer serializer = SerializerProvider.getInstance().getSerializer(requestPolicy.RequestProtocol);
|
|
|
|
Dictionary<String, Object> parameters = serializer.serialize(request.RequestEntity);
|
|
if (!requestPolicy.RequestProtocol.Equals(requestPolicy.ResponseProtocol))
|
|
{
|
|
parameters.Add("_aop_responseFormat", requestPolicy.ResponseProtocol);
|
|
}
|
|
if (requestPolicy.RequestSendTimestamp)
|
|
{
|
|
parameters.Add("_aop_timestamp", DateUtil.currentTimeMillis());
|
|
}
|
|
parameters.Add("_aop_datePattern", DateUtil.getDatePattern());
|
|
foreach (KeyValuePair<string, object> kvp in request.AddtionalParams)
|
|
{
|
|
parameters.Add(kvp.Key, kvp.Value);
|
|
}
|
|
if (request.AccessToken != null)
|
|
{
|
|
parameters.Add("access_token", request.AccessToken);
|
|
}
|
|
return parameters;
|
|
}
|
|
|
|
private void signature(String path, Dictionary<String, Object> parameters, RequestPolicy requestPolicy, ClientPolicy clientPolicy)
|
|
{
|
|
if (!requestPolicy.UseSignture)
|
|
{
|
|
return;
|
|
}
|
|
if (clientPolicy.AppKey == null
|
|
|| clientPolicy.SecretKey == null)
|
|
{
|
|
return;
|
|
}
|
|
byte[] sign = SignatureUtil.hmacSha1(path, parameters, clientPolicy.SecretKey);
|
|
String signStr = SignatureUtil.toHex(sign);
|
|
if (signStr != null)
|
|
{
|
|
parameters.Add("_aop_signature", signStr);
|
|
}
|
|
}
|
|
|
|
|
|
private WebClient createWebClient()
|
|
{
|
|
|
|
WebClient client = new WebClient();
|
|
client.Headers.Add("user-agent", "Ocean/SDK Client");
|
|
|
|
return client;
|
|
}
|
|
}
|
|
}
|
|
|