using System; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using DI_Electrical.Helper; using DI_Electrical.Model; using Newtonsoft.Json; namespace DI_Electrical.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; } } }