using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using SWS.CAD.Models;
using SWS.Commons;
namespace SWS.CAD.Services
{
public class HttpService
{
public HttpService()
{
}
public void Init(string address, int port)
{
// 如果 GlobalObject.client 已经是 null,初始化一个新的 HttpClient 实例
//if (GlobalObject.client == null)
//{
GlobalObject.client = new HttpClient()
{
BaseAddress = new Uri($"http://{address}:{port}/api/"),
Timeout = TimeSpan.FromSeconds(120)
};
//}
//else
//{
// // 如果已经有 client 实例,则更新它的 BaseAddress
// GlobalObject.client.BaseAddress = new Uri($"http://{address}:{port}/api/");
//}
}
///
/// 带入授权码。
///
///
protected virtual void OnInitAuthorizationCode()
{
//httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows 10.0.22621.1265; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/110.0.835.163 Safari/535.1");
//if (AuthorizationCode.IsNullOrEmpty() || httpClient == null) return;
//httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + AuthorizationCode);
}
protected virtual void OnInitRequestHeader(HttpClient httpClient, string mediaType)
{
//httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(mediaType));
httpClient.DefaultRequestHeaders.Add("Accept", mediaType);
httpClient.DefaultRequestHeaders.Add("ContentType", mediaType);
}
private void WriteLog(string requestUri, string strJson)
{
try
{
var uri = new Uri(GlobalObject.client.BaseAddress + requestUri);
var funName = uri.Segments.Last();
LoggerHelper.Current.WriteJson(funName, strJson);
}
catch { }
}
public async Task> GetAsync(string requestUri)
{
//httpClient.Timeout = TimeSpan.FromSeconds(3000);
OnInitAuthorizationCode();
string result = string.Empty;
learunHttpRes resultObj = null;
try
{
var response = await GlobalObject.client.GetAsync(requestUri);
if (response.StatusCode != HttpStatusCode.OK)
{
string errorMsg = $"服务器地址 [{requestUri}] 获取数据失败, 返回HTTP代码:" + response.StatusCode;
LoggerHelper.Current.Error(errorMsg);
throw new HttpRequestException(errorMsg);
}
result = await response.Content.ReadAsStringAsync();
WriteLog(requestUri, result);
resultObj = JsonConvert.DeserializeObject>(result);
}
catch (JsonException)
{
string errorMsg = $"服务器地址 [{requestUri}] 解析为{typeof(T).Name}失败,原始返回数据为: " + result;
LoggerHelper.Current.Error(errorMsg);
resultObj = new learunHttpRes() { code = -100, info = errorMsg };
return resultObj;
}
catch (Exception ex)
{
string errorMsg = $"接口:{requestUri}失败,异常:{ex.Message} ";
LoggerHelper.Current.Error(errorMsg);
resultObj = new learunHttpRes() { code = -100, info=errorMsg };
return resultObj;
}
if (resultObj.code != 200)
{
switch (resultObj.code)
{
case 400:
case 500:
break;
//业务错误,不是http本质错误
default:
string errorMsg = $"服务器地址 [{requestUri}] Get失败, 返回自定义代码:" + resultObj.code;
LoggerHelper.Current.Error(errorMsg);
throw new HttpRequestException(errorMsg);
}
}
LoggerHelper.Current.Info($"Get成功:{requestUri}");
return resultObj;
}
public async Task GetAsyncByOnlyData(string requestUri)
{
//httpClient.Timeout = TimeSpan.FromSeconds(3000);
OnInitAuthorizationCode();
string result = string.Empty;
T resultObj;
try
{
var response = await GlobalObject.client.GetAsync(requestUri);
if (response.StatusCode != HttpStatusCode.OK)
{
string errorMsg = $"服务器地址 [{requestUri}] 获取数据失败, 返回HTTP代码:" + response.StatusCode;
LoggerHelper.Current.Error(errorMsg);
throw new HttpRequestException(errorMsg);
}
result = await response.Content.ReadAsStringAsync();
WriteLog(requestUri, result);
resultObj = JsonConvert.DeserializeObject(result);
}
catch (JsonException)
{
string errorMsg = $"服务器地址 [{requestUri}] 解析为{typeof(T).Name}失败,原始返回数据为: " + result;
LoggerHelper.Current.Error(errorMsg);
throw new JsonException(errorMsg);
}
catch (Exception ex)
{
string errorMsg = $"接口:{requestUri}失败,异常:{ex.Message} ";
LoggerHelper.Current.Error(errorMsg);
throw new JsonException(errorMsg);
}
LoggerHelper.Current.Info($"Get成功:{requestUri}");
return resultObj;
}
///
///
///
/// 响应后的返回数据的类型
/// POST数据对象的类型
///
///
///
///
///
public async Task> PostBodyAsync(string requestUri, T1 postObj)
{
OnInitAuthorizationCode();
string contentType = "application/json";
string strContent = postObj != null ? JsonConvert.SerializeObject(postObj) : "";
var content = new StringContent(strContent, Encoding.UTF8, contentType);
OnInitRequestHeader(GlobalObject.client, contentType);
learunHttpRes resultObj = null;
string result = string.Empty;
try
{
var response = await GlobalObject.client.PostAsync(requestUri, content);
if (response.StatusCode != HttpStatusCode.OK)
{
string errorMsg = $"服务器地址 [{requestUri}] Post数据失败, 返回HTTP代码:" + response.StatusCode;
LoggerHelper.Current.Error(errorMsg);
throw new HttpRequestException(errorMsg);
}
result = await response.Content.ReadAsStringAsync();
WriteLog(requestUri, result);
resultObj = JsonConvert.DeserializeObject>(result);
}
catch (JsonException)
{
string errorMsg = $"服务器地址 [{requestUri}] 解析为{typeof(T).Name}失败,原始返回数据为: " + result;
LoggerHelper.Current.Error(errorMsg);
resultObj = new learunHttpRes() { code = -100, info = errorMsg };
return resultObj;
}
catch (Exception ex)
{
string errorMsg = $"接口:{requestUri}失败,参数数据为:{strContent},异常:{ex.Message} ";
LoggerHelper.Current.Error(errorMsg);
resultObj = new learunHttpRes() { code = -100, info = errorMsg };
return resultObj;
}
if (resultObj.code != 200)
{
switch (resultObj.code)
{
case 400:
case 500:
break;
//业务错误,不是http本质错误
default:
string errorMsg = $"服务器地址 [{requestUri}] Post失败, 返回自定义代码:" + resultObj.code;
LoggerHelper.Current.Error(errorMsg);
throw new HttpRequestException(errorMsg);
}
}
LoggerHelper.Current.Info($"Post成功:{requestUri}");
return resultObj;
}
public async Task PostFileAsync(string requestUri, Stream stream, string fileName)
{
OnInitAuthorizationCode();
string contentType = "multipart/form-data";
var streamContent = new StreamContent(stream, (int)stream.Length);
streamContent.Headers.Add("Content-Type", "application/octet-stream");
var content = new MultipartFormDataContent
{
{ streamContent, "file", fileName }
};
OnInitRequestHeader(GlobalObject.client, contentType);
var response = await GlobalObject.client.PostAsync(requestUri, content);
if (response.StatusCode != HttpStatusCode.OK)
{
string errorMsg = $"服务器地址 [{requestUri}] Post数据失败, 返回HTTP代码:" + response.StatusCode;
LoggerHelper.Current.Error(errorMsg);
throw new HttpRequestException(errorMsg);
}
var result = await response.Content.ReadAsStringAsync();
T resultObj;
try
{
resultObj = JsonConvert.DeserializeObject(result);
}
catch (JsonException)
{
string errorMsg = $"服务器地址 [{requestUri}] 解析为 string 失败,原始返回数据为: " + result;
LoggerHelper.Current.Error(errorMsg);
throw new JsonException(errorMsg);
}
LoggerHelper.Current.Info($"Post上传文件成功:{requestUri}");
return resultObj;
}
}
}