KoogleV4/GameData/ApiClient.cs

261 lines
9.2 KiB
C#

using GameData.Repository;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace GameData
{
public sealed class ApiClient : IDisposable
{
private class Wrapper<T>
{
public T[] Data { get; set; }
}
private readonly HttpClient client;
private readonly string _apiKey = "9wIqngBjwR_l2f89D0EEAN1ldrcXUl6c";
private readonly string Api = "https://directus.straso.com/";
public ApiClient()
{
client = new HttpClient
{
Timeout = TimeSpan.FromMinutes(1)
};
client.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders
.Authorization = new AuthenticationHeaderValue("Bearer", _apiKey);
//client.DefaultRequestHeaders.Add("Api-AppInfo", "KrahApp;" + Assembly.GetExecutingAssembly().GetName().Version.ToString());
if (!Api.EndsWith("/"))
{
Api += "/";
}
}
public void Dispose()
{
client.Dispose();
}
public string UrlEncode(string s)
{
return HttpUtility.UrlEncode(s);
}
private string GetFullUrl(string url)
{
if (url[0].Equals('/'))
{
url = url.Remove(0, 1);
}
url = Api + url;
return url;
}
private HttpRequestMessage GetHttpRequestMessage(HttpMethod method, string serviceUrl, object payload = null)
{
StringContent content = null;
if (payload != null)
{
var payloadString = JsonConvert.SerializeObject(payload);
content = new StringContent(payloadString, Encoding.UTF8, "application/json");
}
var url = serviceUrl;
if (!serviceUrl.StartsWith("http", StringComparison.InvariantCultureIgnoreCase))
{
url = GetFullUrl(serviceUrl);
}
var res = new HttpRequestMessage
{
Content = content,
Method = method,
RequestUri = new Uri(url),
};
//res.Headers.Add("Authorization: Bearer", _apiKey);
return res;
}
public async Task<bool> DownloadFile(string serviceUrl, string targetFile)
{
var res = false;
try
{
var request = GetHttpRequestMessage(HttpMethod.Get, serviceUrl);
request.Headers.Add("Accept", "application/json");
request.Headers.Add("Accept", "application/octet-stream");
request.Headers.Add("Accept", "file/download");
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
using (var fileStream = new FileStream(targetFile, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
await responseStream.CopyToAsync(fileStream);
res = true;
}
}
}
else
{
var errorResult = await response.Content.ReadAsStringAsync();
//_logger.LogError("error downloading from service '{service}' with code '{statuscode}' - Result: '{result}', TargetFile: '{payload}'", serviceUrl, response.StatusCode, errorResult, targetFile);
}
}
catch (Exception ex)
{
//_logger.LogError(ex, "error at DownloadFile");
}
return res;
}
public async Task<T> Post<T>(object payload, string serviceUrl, bool suppressExceptions = true)
{
T res = default;
try
{
var response = await client.SendAsync(GetHttpRequestMessage(HttpMethod.Post, serviceUrl, payload));
if (response.IsSuccessStatusCode)
{
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(responseStream))
{
using (var jsonTextReader = new JsonTextReader(streamReader))
{
var serializer = new JsonSerializer();
res = serializer.Deserialize<T>(jsonTextReader);
}
}
}
}
else
{
var errorResult = await response.Content.ReadAsStringAsync();
//_logger.LogError("error posting to service '{service}' with code '{statuscode}' - Result: '{result}', Payload: '{payload}'", serviceUrl, response.StatusCode, errorResult, JsonConvert.SerializeObject(payload));
}
}
catch (Exception ex)
{
//_logger.LogError(ex, "error at post");
if (!suppressExceptions)
{
throw ex;
}
}
return res;
}
public async Task<T> Delete<T>(object payload, string serviceUrl, bool suppressExceptions = true)
{
T res = default;
try
{
var response = await client.SendAsync(GetHttpRequestMessage(HttpMethod.Delete, serviceUrl, payload));
if (response.IsSuccessStatusCode)
{
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(responseStream))
{
using (var jsonTextReader = new JsonTextReader(streamReader))
{
var serializer = new JsonSerializer();
res = serializer.Deserialize<T>(jsonTextReader);
}
}
}
}
else
{
var errorResult = await response.Content.ReadAsStringAsync();
//_logger.LogError("error deleting to service '{service}' with code '{statuscode}' - Result: '{result}', Payload: '{payload}'", serviceUrl, response.StatusCode, errorResult, JsonConvert.SerializeObject(payload));
}
}
catch (Exception ex)
{
//_logger.LogError(ex, "error at Delete");
if (!suppressExceptions)
{
throw ex;
}
}
return res;
}
public T[] Get<T>(string serviceUrl, bool suppressExceptions = true)
{
Wrapper<T> res = default;
try
{
//_logger.LogDebug($"calling service url {serviceUrl}");
var response = client.Send(GetHttpRequestMessage(HttpMethod.Get, serviceUrl));
if (response.IsSuccessStatusCode)
{
using (var responseStream = response.Content.ReadAsStream())
{
using (var streamReader = new StreamReader(responseStream))
{
string content;
if (typeof(T).Equals(typeof(string)))
{
content = streamReader.ReadToEnd();
res = (Wrapper<T>)Convert.ChangeType(content, typeof(T));
}
else
{
using (var jsonTextReader = new JsonTextReader(streamReader))
{
var serializer = new JsonSerializer();
//serializer.
res = serializer.Deserialize<Wrapper<T>>(jsonTextReader);
}
}
}
}
}
else
{
var errorResult = response.Content.ReadAsStringAsync();
//_logger.LogError("error getting from service '{service}' with code '{statuscode}' - Result: '{result}'", serviceUrl, response.StatusCode, errorResult);
}
}
catch (Exception ex)
{
//_logger.LogError(ex, "error at Get");
if (!suppressExceptions)
{
throw ex;
}
}
return res.Data;
}
}
}