mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-06-08 00:16:27 +00:00
Moved some parameters from BaseRestClient to RestApiClient to support different setting between different sub api's
This commit is contained in:
parent
13c81afb79
commit
edfaa650bf
@ -1,4 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net.Http;
|
||||||
using CryptoExchange.Net.Authentication;
|
using CryptoExchange.Net.Authentication;
|
||||||
using CryptoExchange.Net.Objects;
|
using CryptoExchange.Net.Objects;
|
||||||
|
|
||||||
@ -31,6 +33,37 @@ namespace CryptoExchange.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Where to put the parameters for requests with different Http methods
|
||||||
|
/// </summary>
|
||||||
|
public Dictionary<HttpMethod, HttpMethodParameterPosition> ParameterPositions { get; set; } = new Dictionary<HttpMethod, HttpMethodParameterPosition>
|
||||||
|
{
|
||||||
|
{ HttpMethod.Get, HttpMethodParameterPosition.InUri },
|
||||||
|
{ HttpMethod.Post, HttpMethodParameterPosition.InBody },
|
||||||
|
{ HttpMethod.Delete, HttpMethodParameterPosition.InBody },
|
||||||
|
{ HttpMethod.Put, HttpMethodParameterPosition.InBody }
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Request body content type
|
||||||
|
/// </summary>
|
||||||
|
public RequestBodyFormat requestBodyFormat = RequestBodyFormat.Json;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether or not we need to manually parse an error instead of relying on the http status code
|
||||||
|
/// </summary>
|
||||||
|
public bool manualParseError = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// How to serialize array parameters when making requests
|
||||||
|
/// </summary>
|
||||||
|
public ArrayParametersSerialization arraySerialization = ArrayParametersSerialization.Array;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// What request body should be set when no data is send (only used in combination with postParametersPosition.InBody)
|
||||||
|
/// </summary>
|
||||||
|
public string requestBodyEmptyContent = "{}";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The base address for this API client
|
/// The base address for this API client
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -27,37 +27,6 @@ namespace CryptoExchange.Net
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public IRequestFactory RequestFactory { get; set; } = new RequestFactory();
|
public IRequestFactory RequestFactory { get; set; } = new RequestFactory();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Where to put the parameters for requests with different Http methods
|
|
||||||
/// </summary>
|
|
||||||
protected Dictionary<HttpMethod, HttpMethodParameterPosition> ParameterPositions { get; set; } = new Dictionary<HttpMethod, HttpMethodParameterPosition>
|
|
||||||
{
|
|
||||||
{ HttpMethod.Get, HttpMethodParameterPosition.InUri },
|
|
||||||
{ HttpMethod.Post, HttpMethodParameterPosition.InBody },
|
|
||||||
{ HttpMethod.Delete, HttpMethodParameterPosition.InBody },
|
|
||||||
{ HttpMethod.Put, HttpMethodParameterPosition.InBody }
|
|
||||||
};
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Request body content type
|
|
||||||
/// </summary>
|
|
||||||
protected RequestBodyFormat requestBodyFormat = RequestBodyFormat.Json;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Whether or not we need to manually parse an error instead of relying on the http status code
|
|
||||||
/// </summary>
|
|
||||||
protected bool manualParseError = false;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// How to serialize array parameters when making requests
|
|
||||||
/// </summary>
|
|
||||||
protected ArrayParametersSerialization arraySerialization = ArrayParametersSerialization.Array;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// What request body should be set when no data is send (only used in combination with postParametersPosition.InBody)
|
|
||||||
/// </summary>
|
|
||||||
protected string requestBodyEmptyContent = "{}";
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public int TotalRequestsMade => ApiClients.OfType<RestApiClient>().Sum(s => s.TotalRequestsMade);
|
public int TotalRequestsMade => ApiClients.OfType<RestApiClient>().Sum(s => s.TotalRequestsMade);
|
||||||
|
|
||||||
@ -154,8 +123,8 @@ namespace CryptoExchange.Net
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Write(LogLevel.Information, $"[{requestId}] Creating request for " + uri);
|
log.Write(LogLevel.Information, $"[{requestId}] Creating request for " + uri);
|
||||||
var paramsPosition = parameterPosition ?? ParameterPositions[method];
|
var paramsPosition = parameterPosition ?? apiClient.ParameterPositions[method];
|
||||||
var request = ConstructRequest(apiClient, uri, method, parameters, signed, paramsPosition, arraySerialization ?? this.arraySerialization, requestId, additionalHeaders);
|
var request = ConstructRequest(apiClient, uri, method, parameters, signed, paramsPosition, arraySerialization ?? apiClient.arraySerialization, requestId, additionalHeaders);
|
||||||
|
|
||||||
string? paramString = "";
|
string? paramString = "";
|
||||||
if (paramsPosition == HttpMethodParameterPosition.InBody)
|
if (paramsPosition == HttpMethodParameterPosition.InBody)
|
||||||
@ -167,17 +136,18 @@ namespace CryptoExchange.Net
|
|||||||
|
|
||||||
apiClient.TotalRequestsMade++;
|
apiClient.TotalRequestsMade++;
|
||||||
log.Write(LogLevel.Trace, $"[{requestId}] Sending {method}{(signed ? " signed" : "")} request to {request.Uri}{paramString ?? " "}{(ClientOptions.Proxy == null ? "" : $" via proxy {ClientOptions.Proxy.Host}")}");
|
log.Write(LogLevel.Trace, $"[{requestId}] Sending {method}{(signed ? " signed" : "")} request to {request.Uri}{paramString ?? " "}{(ClientOptions.Proxy == null ? "" : $" via proxy {ClientOptions.Proxy.Host}")}");
|
||||||
return await GetResponseAsync<T>(request, deserializer, cancellationToken).ConfigureAwait(false);
|
return await GetResponseAsync<T>(apiClient, request, deserializer, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Executes the request and returns the result deserialized into the type parameter class
|
/// Executes the request and returns the result deserialized into the type parameter class
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="apiClient">The client making the request</param>
|
||||||
/// <param name="request">The request object to execute</param>
|
/// <param name="request">The request object to execute</param>
|
||||||
/// <param name="deserializer">The JsonSerializer to use for deserialization</param>
|
/// <param name="deserializer">The JsonSerializer to use for deserialization</param>
|
||||||
/// <param name="cancellationToken">Cancellation token</param>
|
/// <param name="cancellationToken">Cancellation token</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
protected virtual async Task<WebCallResult<T>> GetResponseAsync<T>(IRequest request, JsonSerializer? deserializer, CancellationToken cancellationToken)
|
protected virtual async Task<WebCallResult<T>> GetResponseAsync<T>(BaseApiClient apiClient, IRequest request, JsonSerializer? deserializer, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -191,7 +161,7 @@ namespace CryptoExchange.Net
|
|||||||
{
|
{
|
||||||
// If we have to manually parse error responses (can't rely on HttpStatusCode) we'll need to read the full
|
// If we have to manually parse error responses (can't rely on HttpStatusCode) we'll need to read the full
|
||||||
// response before being able to deserialize it into the resulting type since we don't know if it an error response or data
|
// response before being able to deserialize it into the resulting type since we don't know if it an error response or data
|
||||||
if (manualParseError)
|
if (apiClient.manualParseError)
|
||||||
{
|
{
|
||||||
using var reader = new StreamReader(responseStream);
|
using var reader = new StreamReader(responseStream);
|
||||||
var data = await reader.ReadToEndAsync().ConfigureAwait(false);
|
var data = await reader.ReadToEndAsync().ConfigureAwait(false);
|
||||||
@ -362,11 +332,11 @@ namespace CryptoExchange.Net
|
|||||||
|
|
||||||
if (parameterPosition == HttpMethodParameterPosition.InBody)
|
if (parameterPosition == HttpMethodParameterPosition.InBody)
|
||||||
{
|
{
|
||||||
var contentType = requestBodyFormat == RequestBodyFormat.Json ? Constants.JsonContentHeader : Constants.FormContentHeader;
|
var contentType = apiClient.requestBodyFormat == RequestBodyFormat.Json ? Constants.JsonContentHeader : Constants.FormContentHeader;
|
||||||
if (bodyParameters.Any())
|
if (bodyParameters.Any())
|
||||||
WriteParamBody(request, bodyParameters, contentType);
|
WriteParamBody(apiClient, request, bodyParameters, contentType);
|
||||||
else
|
else
|
||||||
request.SetContent(requestBodyEmptyContent, contentType);
|
request.SetContent(apiClient.requestBodyEmptyContent, contentType);
|
||||||
}
|
}
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
@ -375,18 +345,19 @@ namespace CryptoExchange.Net
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes the parameters of the request to the request object body
|
/// Writes the parameters of the request to the request object body
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="apiClient">The client making the request</param>
|
||||||
/// <param name="request">The request to set the parameters on</param>
|
/// <param name="request">The request to set the parameters on</param>
|
||||||
/// <param name="parameters">The parameters to set</param>
|
/// <param name="parameters">The parameters to set</param>
|
||||||
/// <param name="contentType">The content type of the data</param>
|
/// <param name="contentType">The content type of the data</param>
|
||||||
protected virtual void WriteParamBody(IRequest request, SortedDictionary<string, object> parameters, string contentType)
|
protected virtual void WriteParamBody(BaseApiClient apiClient, IRequest request, SortedDictionary<string, object> parameters, string contentType)
|
||||||
{
|
{
|
||||||
if (requestBodyFormat == RequestBodyFormat.Json)
|
if (apiClient.requestBodyFormat == RequestBodyFormat.Json)
|
||||||
{
|
{
|
||||||
// Write the parameters as json in the body
|
// Write the parameters as json in the body
|
||||||
var stringData = JsonConvert.SerializeObject(parameters);
|
var stringData = JsonConvert.SerializeObject(parameters);
|
||||||
request.SetContent(stringData, contentType);
|
request.SetContent(stringData, contentType);
|
||||||
}
|
}
|
||||||
else if (requestBodyFormat == RequestBodyFormat.FormData)
|
else if (apiClient.requestBodyFormat == RequestBodyFormat.FormData)
|
||||||
{
|
{
|
||||||
// Write the parameters as form data in the body
|
// Write the parameters as form data in the body
|
||||||
var stringData = parameters.ToFormData();
|
var stringData = parameters.ToFormData();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user