From 0b7bcf0a7f3be4919721f9c32c2b68a529adea8c Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期四, 21 八月 2025 16:26:48 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs | 140 ++++++++++++++++++++++++---------------------- 1 files changed, 72 insertions(+), 68 deletions(-) diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs index 40da33e..1983841 100644 --- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs +++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs @@ -1,94 +1,98 @@ 锘縰sing Azure; using Consul; using Furion; +using Furion.DatabaseAccessor; using Furion.FriendlyException; using Furion.HttpRemote; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Distributed; +using RabbitMQ.Client; using System; using System.Collections.Generic; using System.ComponentModel.Design; using System.Linq; using System.Net.Http; +using System.Reflection; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { - public class ResourceHttpUtils + public static class ResourceHttpUtils { - private readonly IDistributedCache distributedCache; - private readonly IHttpRemoteService httpRemoteService; - private readonly IConsulClient consulClient; - - public ResourceHttpUtils( - IDistributedCache distributedCache, - IHttpRemoteService httpRemoteService, - IConsulClient consulClient) + public static async Task<string> SendHttpAsync(this object request, string serviceName, string route, EnumResourceMethod method, EnumResourceHttpProvider? provider = null) { - this.distributedCache = distributedCache; - this.httpRemoteService = httpRemoteService; - this.consulClient = consulClient; - } - - /// <summary> - /// 鍙戦�丠TTP璇锋眰 - /// </summary> - /// <typeparam name="TRequest"></typeparam> - /// <typeparam name="TResponse"></typeparam> - /// <param name="request"></param> - /// <param name="provider"></param> - /// <returns></returns> - public async Task<TResponse> SendHttpAsync<TRequest, TResponse>( - TRequest request, - IResourceHttpProvider provider = null) - where TRequest : class, new() - { - var requestTypeFullName = typeof(TRequest).FullName; - - var jsonResourceModels = await distributedCache.GetStringAsync($"ResourceModel|{requestTypeFullName}"); - var resource = jsonResourceModels.JsonTo<ResourceModel>(); - var url = await GetUrl(resource.ServiceName, resource.Route); - var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), url); - if (resource.Method == EnumResourceMethod.Get) - builder = builder.WithQueryParameters(request); - else - builder = builder.SetJsonContent(request); - provider = provider ?? new DefaultResourceHttpProvider(); - builder = provider.AddAuthentication(builder); - var response = await provider.SendAsAsync<TResponse>(httpRemoteService, builder); - return response; - } - - public async Task<string> SendHttpAsync(Resource resource, string request, IResourceHttpProvider provider = null) - { - var url = await GetUrl(resource.ServiceName, resource.Route); - var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), url); - if (resource.Method == EnumResourceMethod.Get) - builder = builder.WithQueryParameters(request); - else - builder = builder.SetJsonContent(request); - provider = provider ?? new DefaultResourceHttpProvider(); - builder = provider.AddAuthentication(builder); - var response = await provider.SendAsStringAsync(httpRemoteService, builder); - return response; - } - - public async Task<string> SendHttpAsync(EnumResourceService service, HttpMethod method, string route, string request, IResourceHttpProvider provider = null) - { - var serviceName = service.GetCustomAttribute<EnumResourceService, ResourceServiceAttribute>().ServiceName; + serviceName = App.GetConfig<string>($"{serviceName}:ServiceName"); var url = await GetUrl(serviceName, route); - var builder = HttpRequestBuilder.Create(method, url); - if (method == HttpMethod.Get) + var builder = HttpRequestBuilder.Create(method.GetMethod(), url); + if (method == EnumResourceMethod.Get) builder = builder.WithQueryParameters(request); else builder = builder.SetJsonContent(request); - provider = provider ?? new DefaultResourceHttpProvider(); - builder = provider.AddAuthentication(builder); - var response = await provider.SendAsStringAsync(httpRemoteService, builder); + IResourceHttpProvider httpProvider = + provider == EnumResourceHttpProvider.SystemUser + ? new SystemUserResourceHttpProvider() + : provider == EnumResourceHttpProvider.ElectronSignServer + ? new ElectronSignServerResourceHttpProvider() + : provider == EnumResourceHttpProvider.ElectronSignServerCustomer + ? new ElectronSignServerCustomerResourceHttpProvider() + : new DefaultResourceHttpProvider(); + var response = await httpProvider.SendAsStringAsync(builder); return response; } - public async Task<string> GetUrl(string serviceName, string route) + public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(this TRequest request, EnumResourceHttpProvider? provider = null) + { + var requestType = typeof(TRequest); + var resourceAttribute = requestType.GetCustomAttribute<ResourceAttribute>(); + if (resourceAttribute == null) throw Oops.Oh(EnumErrorCodeType.s400, "缂哄け璧勬簮鐗规��"); + var controller = resourceAttribute.Controllers.FirstOrDefault(); + var resourceControllerAttribute = controller.GetCustomAttribute<EnumResourceController, ResourceControllerAttribute>(); + if (resourceAttribute == null) throw Oops.Oh(EnumErrorCodeType.s400, "缂哄け鎺у埗鍣ㄧ壒鎬�"); + var serviceName = resourceControllerAttribute.Service.ToString(); + var route = resourceAttribute.Route; + var method = resourceAttribute.Method; + var requestXmlDoc = await requestType.GetXmlDocMemberAsync(); + if (route.IsNull() || method == EnumResourceMethod.None) + { + var resource = await Db.GetRepository<Resource>().AsQueryable().AsNoTracking() + .Where(it => + it.ServiceName == serviceName + && it.ControllerName == resourceControllerAttribute.ControllerName + && it.Code == requestXmlDoc.Name) + .Select(it => new + { + it.Route, + it.Method + }) + .FirstOrDefaultAsync(); + if (resource == null) throw Oops.Oh(EnumErrorCodeType.s404, "璧勬簮"); + route = resource.Route; + method = resource.Method; + } + var responseJson = await request.SendHttpAsync(serviceName, route, method, provider); + var response = responseJson.JsonTo<TResponse>(); + return response; + } + + public static HttpMethod GetMethod(this EnumResourceMethod method) + { + switch (method) + { + case EnumResourceMethod.Get: + return HttpMethod.Get; + case EnumResourceMethod.Post: + return HttpMethod.Post; + case EnumResourceMethod.Put: + return HttpMethod.Put; + case EnumResourceMethod.Delete: + return HttpMethod.Delete; + default: + throw Oops.Oh(EnumErrorCodeType.s400, "涓嶆敮鎸佺殑璇锋眰绫诲瀷"); + } + } + + public static async Task<string> GetUrl(string serviceName, string route) { var domain = await GetHealthyServiceDomain(serviceName); return $"{domain}{route}"; @@ -99,12 +103,12 @@ /// </summary> /// <param name="serviceName"></param> /// <returns></returns> - public async Task<string> GetHealthyServiceDomain(string serviceName) + public static async Task<string> GetHealthyServiceDomain(string serviceName) { var env = App.GetConfig<string>("Environment"); serviceName = $"{env}_{serviceName}"; - var queryResult = await consulClient.Health.Service(serviceName, null, true); + var queryResult = await App.GetRequiredService<IConsulClient>().Health.Service(serviceName, null, true); if (queryResult.StatusCode != System.Net.HttpStatusCode.OK) throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔serviceName}"); -- Gitblit v1.9.1