| | |
| | | /// <typeparam name="TRequest"></typeparam> |
| | | /// <typeparam name="TResponse"></typeparam> |
| | | /// <param name="request"></param> |
| | | /// <param name="provider"></param> |
| | | /// <returns></returns> |
| | | public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(TRequest request) |
| | | public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>( |
| | | TRequest request, |
| | | IResourceHttpProvider provider = null) |
| | | where TRequest : class, new() |
| | | { |
| | | var requestTypeFullName = typeof(TRequest).FullName; |
| | |
| | | .FirstOrDefaultAsync(); |
| | | var domain = await GetHealthyServiceDomain(resource); |
| | | var httpRemoteService = App.GetRequiredService<IHttpRemoteService>(); |
| | | var token = App.HttpContext.Request.Headers["Authorization"].ToString(); |
| | | var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString(); |
| | | TResponse response; |
| | | switch (resource.Method) |
| | | { |
| | | case EnumResourceMethod.Get: |
| | | response = await httpRemoteService.GetAsAsync<TResponse>( |
| | | $"{domain}{resource.Route}", |
| | | it => |
| | | it.WithQueryParameters(request) |
| | | .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) |
| | | .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); |
| | | break; |
| | | case EnumResourceMethod.Post: |
| | | response = await httpRemoteService.PostAsAsync<TResponse>( |
| | | $"{domain}{resource.Route}", |
| | | it => |
| | | it.SetJsonContent(request) |
| | | .WithHeader("Authorization", token) |
| | | .WithHeader("X-Authorization", refreshToken)); |
| | | break; |
| | | case EnumResourceMethod.Put: |
| | | response = await httpRemoteService.PutAsAsync<TResponse>( |
| | | $"{domain}{resource.Route}", |
| | | it => |
| | | it.SetJsonContent(request) |
| | | .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) |
| | | .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); |
| | | break; |
| | | case EnumResourceMethod.Delete: |
| | | response = await httpRemoteService.DeleteAsAsync<TResponse>( |
| | | $"{domain}{resource.Route}", |
| | | it => |
| | | it.SetJsonContent(request) |
| | | .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) |
| | | .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); |
| | | break; |
| | | default: |
| | | throw Oops.Oh(EnumErrorCodeType.s400, $"不支持请求方式{resource.Method}"); |
| | | } |
| | | var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), $"{domain}{resource.Route}"); |
| | | 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; |
| | | } |
| | | |