diff --git a/HttpClientStudy.Core/DelegatingHandlers/HandlerA.cs b/HttpClientStudy.Core/DelegatingHandlers/HandlerA.cs new file mode 100644 index 0000000..b2e2cb1 --- /dev/null +++ b/HttpClientStudy.Core/DelegatingHandlers/HandlerA.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HttpClientStudy.Core +{ + public class HandlerA : DelegatingHandler + { + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + //请求前业务 + + var response = await base.SendAsync(request, cancellationToken); + + //响应后业务 + + return response; + } + } +} diff --git a/HttpClientStudy.Core/DelegatingHandlers/HandlerB.cs b/HttpClientStudy.Core/DelegatingHandlers/HandlerB.cs new file mode 100644 index 0000000..b0a1137 --- /dev/null +++ b/HttpClientStudy.Core/DelegatingHandlers/HandlerB.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HttpClientStudy.Core +{ + public class HandlerB : DelegatingHandler + { + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + InnerHandler = new SocketsHttpHandler() { }; + + //请求前业务 + + var response = await base.SendAsync(request, cancellationToken); + + //响应后业务 + + return response; + } + } +} diff --git a/HttpClientStudy.Core/HttpClientStudy.Core.csproj b/HttpClientStudy.Core/HttpClientStudy.Core.csproj index 17a26c4..6061868 100644 --- a/HttpClientStudy.Core/HttpClientStudy.Core.csproj +++ b/HttpClientStudy.Core/HttpClientStudy.Core.csproj @@ -18,4 +18,8 @@ + + + + diff --git a/HttpClientStudy.Core/PipelineHttpClient.cs b/HttpClientStudy.Core/HttpClients/PipelineHttpClient.cs similarity index 94% rename from HttpClientStudy.Core/PipelineHttpClient.cs rename to HttpClientStudy.Core/HttpClients/PipelineHttpClient.cs index 668345e..85104cd 100644 --- a/HttpClientStudy.Core/PipelineHttpClient.cs +++ b/HttpClientStudy.Core/HttpClients/PipelineHttpClient.cs @@ -14,18 +14,18 @@ namespace HttpClientStudy.Core { public List HttpMessageHandlers { get; set; } - public PipelineHttpClient() + public PipelineHttpClient() { HttpMessageHandlers = new List() - { + { new CustomHeadersHandler(), new LoggingHandler(), }; } - public PipelineHttpClient(List httpMessageHandlers) - { + public PipelineHttpClient(List httpMessageHandlers) + { HttpMessageHandlers = httpMessageHandlers; if (httpMessageHandlers == null || httpMessageHandlers?.Count == 0) { @@ -34,8 +34,8 @@ namespace HttpClientStudy.Core } public void AddDelegatingHandler(DelegatingHandler handler) - { - this.HttpMessageHandlers.Add(handler); + { + HttpMessageHandlers.Add(handler); } public HttpClient CreateHttpClient() @@ -44,10 +44,10 @@ namespace HttpClientStudy.Core //最终处理器:最后一个请求处理程序,默认是SocketsHttpHandler. HttpMessageHandler currentPipeLine = new SocketsHttpHandler() - { + { //自定义配置 PooledConnectionLifetime = TimeSpan.FromSeconds(120), - }; + }; //pipeline = new CustomHeadersHandler() { InnerHandler = pipeline}; //pipeline = new LoggingHandler () { InnerHandler = pipeline}; diff --git a/HttpClientStudy.Core/PollyHttpClient.cs b/HttpClientStudy.Core/HttpClients/PollyHttpClient.cs similarity index 99% rename from HttpClientStudy.Core/PollyHttpClient.cs rename to HttpClientStudy.Core/HttpClients/PollyHttpClient.cs index 2e62768..44f1a4a 100644 --- a/HttpClientStudy.Core/PollyHttpClient.cs +++ b/HttpClientStudy.Core/HttpClients/PollyHttpClient.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; - using Polly; using Polly.Utilities; diff --git a/HttpClientStudy.Core/SimpleHttpClient.cs b/HttpClientStudy.Core/HttpClients/SimpleHttpClient.cs similarity index 100% rename from HttpClientStudy.Core/SimpleHttpClient.cs rename to HttpClientStudy.Core/HttpClients/SimpleHttpClient.cs diff --git a/HttpClientStudy.Core/UsedFactoryHttpClient.cs b/HttpClientStudy.Core/HttpClients/UsedFactoryHttpClient.cs similarity index 97% rename from HttpClientStudy.Core/UsedFactoryHttpClient.cs rename to HttpClientStudy.Core/HttpClients/UsedFactoryHttpClient.cs index 3979ed8..e5f028c 100644 --- a/HttpClientStudy.Core/UsedFactoryHttpClient.cs +++ b/HttpClientStudy.Core/HttpClients/UsedFactoryHttpClient.cs @@ -12,6 +12,6 @@ namespace HttpClientStudy.Core /// public class UsedFactoryHttpClient { - + } } diff --git a/HttpClientStudy.UnitTest/DelegatingHandlerTest.cs b/HttpClientStudy.UnitTest/DelegatingHandlerTest.cs index 3d1a769..9a9f00e 100644 --- a/HttpClientStudy.UnitTest/DelegatingHandlerTest.cs +++ b/HttpClientStudy.UnitTest/DelegatingHandlerTest.cs @@ -29,40 +29,10 @@ namespace HttpClientStudy.UnitTest HttpClient httpClient = new HttpClient(handler); - var sd = await httpClient.GetAsync("http://127.0.0.1"); + var sd = await httpClient.GetAsync(TestConfig.WebApiBaseUrl + "/api/"); var contentText = await sd.Content.ReadAsStringAsync(); _logger.WriteLine(contentText); } } - - public class HandlerB : DelegatingHandler - { - protected override async Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) - { - InnerHandler = new SocketsHttpHandler() { }; - - //请求前业务 - - var response = await base.SendAsync(request, cancellationToken); - - //响应后业务 - - return response; - } - } - - public class HandlerA : DelegatingHandler - { - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - //请求前业务 - - var response = await base.SendAsync(request, cancellationToken); - - //响应后业务 - - return response; - } - } } diff --git a/HttpClientStudy.UnitTest/GlobalUsings.cs b/HttpClientStudy.UnitTest/GlobalUsings.cs index b5b9a32..c9d6b35 100644 --- a/HttpClientStudy.UnitTest/GlobalUsings.cs +++ b/HttpClientStudy.UnitTest/GlobalUsings.cs @@ -12,8 +12,11 @@ global using Xunit.Internal; global using Xunit.Serialization; global using HttpClientStudy.Model; + global using HttpClientStudy.Core; + global using HttpClientStudy.Service; + global using HttpClientStudy.WebApp; global using HttpClientStudy.WebApp.Models; global using HttpClientStudy.WebApp.Controllers; \ No newline at end of file diff --git a/HttpClientStudy.UnitTest/AdvancedGetTest.cs b/HttpClientStudy.UnitTest/HttpClients/AdvancedGetTest.cs similarity index 97% rename from HttpClientStudy.UnitTest/AdvancedGetTest.cs rename to HttpClientStudy.UnitTest/HttpClients/AdvancedGetTest.cs index 4f487ae..959830f 100644 --- a/HttpClientStudy.UnitTest/AdvancedGetTest.cs +++ b/HttpClientStudy.UnitTest/HttpClients/AdvancedGetTest.cs @@ -6,10 +6,9 @@ using System.Security.Cryptography.Xml; using System.Text; using System.Text.Unicode; using System.Threading.Tasks; - using Newtonsoft.Json; -namespace HttpClientStudy.UnitTest +namespace HttpClientStudy.UnitTest.HttpClients { /// /// 高级Get请求 测试 @@ -105,10 +104,10 @@ namespace HttpClientStudy.UnitTest public async Task GetWithJsonBody_Test() { //因为get方法,不能使用System.Net.Http.Json中的扩展方法 - var vm = new AdvancedGetModel() { Id=3, Name = "张三" }; + var vm = new AdvancedGetModel() { Id = 3, Name = "张三" }; var content = new StringContent(JsonConvert.SerializeObject(vm), Encoding.UTF8, System.Net.Mime.MediaTypeNames.Application.Json); - var requestMessage = new HttpRequestMessage(HttpMethod.Get,"/api/AdvancedGet/GetWithJsonBody") + var requestMessage = new HttpRequestMessage(HttpMethod.Get, "/api/AdvancedGet/GetWithJsonBody") { Content = content, }; diff --git a/HttpClientStudy.UnitTest/HttpClientQuestTest.cs b/HttpClientStudy.UnitTest/HttpClients/HttpClientQuestTest.cs similarity index 98% rename from HttpClientStudy.UnitTest/HttpClientQuestTest.cs rename to HttpClientStudy.UnitTest/HttpClients/HttpClientQuestTest.cs index e8af66f..e20cc5c 100644 --- a/HttpClientStudy.UnitTest/HttpClientQuestTest.cs +++ b/HttpClientStudy.UnitTest/HttpClients/HttpClientQuestTest.cs @@ -13,7 +13,7 @@ using System.Security.Authentication.ExtendedProtection; using Newtonsoft.Json.Linq; using System.Text.Json.Serialization.Metadata; -namespace HttpClientStudy.UnitTest +namespace HttpClientStudy.UnitTest.HttpClients { /// /// HttpClient 常见问题测试 @@ -22,7 +22,7 @@ namespace HttpClientStudy.UnitTest { private readonly ITestOutputHelper _logger; - public HttpClientQuestTest(ITestOutputHelper outputHelper) + public HttpClientQuestTest(ITestOutputHelper outputHelper) { _logger = outputHelper; } @@ -74,4 +74,4 @@ namespace HttpClientStudy.UnitTest } } } -} +} diff --git a/HttpClientStudy.UnitTest/PipelineClientTest.cs b/HttpClientStudy.UnitTest/HttpClients/PipelineClientTest.cs similarity index 88% rename from HttpClientStudy.UnitTest/PipelineClientTest.cs rename to HttpClientStudy.UnitTest/HttpClients/PipelineClientTest.cs index cfc923b..96a1296 100644 --- a/HttpClientStudy.UnitTest/PipelineClientTest.cs +++ b/HttpClientStudy.UnitTest/HttpClients/PipelineClientTest.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace HttpClientStudy.UnitTest +namespace HttpClientStudy.UnitTest.HttpClients { public class PipelineClientTest { @@ -12,7 +12,7 @@ namespace HttpClientStudy.UnitTest [Fact] public async Task Test() - { + { HttpClient client = new PipelineHttpClient().CreateHttpClient(); var r = await client.GetAsync("https://www.baidu.com"); diff --git a/HttpClientStudy.UnitTest/Core/SimpleHttpClientTest.cs b/HttpClientStudy.UnitTest/HttpClients/SimpleHttpClientTest.cs similarity index 87% rename from HttpClientStudy.UnitTest/Core/SimpleHttpClientTest.cs rename to HttpClientStudy.UnitTest/HttpClients/SimpleHttpClientTest.cs index 2954b73..ce1838f 100644 --- a/HttpClientStudy.UnitTest/Core/SimpleHttpClientTest.cs +++ b/HttpClientStudy.UnitTest/HttpClients/SimpleHttpClientTest.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace HttpClientStudy.UnitTest.Core +namespace HttpClientStudy.UnitTest.HttpClients { /// /// SimpleHttpClient 测试类 diff --git a/HttpClientStudy.UnitTest/SimpleHttpClientTest.cs b/HttpClientStudy.UnitTest/SimpleHttpClientTest.cs deleted file mode 100644 index c5b366a..0000000 --- a/HttpClientStudy.UnitTest/SimpleHttpClientTest.cs +++ /dev/null @@ -1,511 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using System.Net.Http.Json; -using System.Net; -using Newtonsoft.Json; -using Microsoft.AspNetCore.Mvc; -using System.Text.Json; -using System.Security.Authentication.ExtendedProtection; -using Newtonsoft.Json.Linq; -using System.Text.Json.Serialization.Metadata; - -namespace HttpClientStudy.UnitTest -{ - /// - /// 基础HttpClient 测试 - /// - public class SimpleHttpClientTest - { - private readonly ITestOutputHelper _logger; - - public SimpleHttpClientTest(ITestOutputHelper outputHelper) - { - _logger = outputHelper; - } - - #region GET请求 - - [Fact] - public async Task GetAllAccounts_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var responseMessage = await httpClient.GetAsync("/api/Normal/GetAllAccounts"); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>>(); - Assert.IsType>>(result); - Assert.Equal(1, result.Code); - Assert.NotNull(result.Data); - } - - /// - /// GET 请求 - /// (默认参数方式:url传参) - /// - /// - [Fact] - public async Task GetAccount_Id_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccount?Id=2"); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - Assert.Equal(2, result.Data?.Id); - } - - /// - /// GET 请求 - /// (路由传参) - /// - /// - [Fact] - public async Task GetAccount_Route_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccount/管理员02"); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - Assert.Equal("管理员02", result.Data?.Name); - } - - /// - /// GET 请求 - /// (中文参数:现在浏览器直接支持,为最大兼容老旧浏览器使用url编码) - /// - /// - [Fact] - public async Task GetAccountByName_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var ChineseName = System.Net.WebUtility.UrlEncode("管理员01"); - var ChineseName2 = System.Net.WebUtility.UrlEncode("管理员02"); - - //现在浏览器直接支持中文参数 - //var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccountByName?ChineseName=管理员01&ChineseName2=管理员02"); - - //兼容老浏览器写法 - var responseMessage = await httpClient.GetAsync($"/api/Normal/GetAccountByName?ChineseName={ChineseName}&ChineseName2={ChineseName2}"); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>>(); - Assert.IsType>>(result); - Assert.Equal(1, result.Code); - Assert.Equal(2, result.Data?.Count); - } - - /// - /// GET 请求 - /// (查询参数传参) - /// - /// - [Fact] - public async Task GetAccountByRole_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccountByRole?role=Admin"); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>>(); - Assert.IsType>>(result); - Assert.Equal(1, result.Code); - //每项的角色都是查询的角色 - Assert.False(result.Data?.Any(d=>d.Role != "Admin")); - } - - /// - /// GET 请求 - /// (请求头传参:中文必须Url编码,服务端Url解码后使用) - /// - /// - [Fact] - public async Task GetAccountFromHeader_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - //中文参数必须先编码 - httpClient.DefaultRequestHeaders.Add("name", System.Net.WebUtility.UrlEncode("管理员01")); - var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccountFromHeader"); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - Assert.Equal(1,result.Data?.Id); - } - - /// - /// GET 请求 - /// (客户端不传参,服务端参数直接来由IoC中注入的服务) - /// - /// - [Fact] - public async Task GetAccountByService_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccountFromServices"); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - Assert.Equal("服务注入示例",result.Data?.Name); - } - - /// - /// GET 请求 - /// (直接调用System.Net.Http.Json类的扩展方法GetFromJsonAsync 获取 Json 结果) - /// - /// - [Fact] - public async Task Get_From_Json_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var result = await httpClient.GetFromJsonAsync>("/api/Normal/GetAccountFromServices"); - - Assert.IsType>(result); - Assert.Equal(1, result.Code); - Assert.Equal("服务注入示例", result.Data?.Name); - } - #endregion - - #region PUT 请求 - /// - /// Put 请求 - /// (新建或替换、更新资源) - /// - /// - [Fact] - public async Task PutDemo_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var responseMessage = await httpClient.PutAsync("/api/Normal/PutDemo?id=2",null); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadAsStringAsync(); - - } - #endregion - - #region HEAD 请求 - /// - /// Head 请求 - /// 注意:HttpClient没有直接提供HEAD请求方法: - /// 步骤1:构建 HttpRequestMessage 对象,设置HttpMethod.Head - /// 步骤2:把上步构建的HttpRequestMessage 对象,作为参数传递给 HttpClient实例的 Send 或 SendAsync 方法 - /// - /// - [Fact] - public async Task HeadDemo_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var requestMessage = new HttpRequestMessage(HttpMethod.Head, "/api/Normal/HeadDemo?Id=2"); - - HttpResponseMessage responseMessage = await httpClient.SendAsync(requestMessage); - - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - //head请求没有返回体 - var result = await responseMessage.Content.ReadAsStringAsync(); - Assert.Empty(result); - } - #endregion - - #region POST 请求 - - [Fact] - public async Task PostSimple_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - //响应 - var responseMessage = await httpClient.PostAsync("/api/Normal/PostSimple", null); - - //响应正常 - Assert.True(responseMessage.IsSuccessStatusCode); - Assert.NotNull(responseMessage); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result?.Code); - } - - [Fact] - public async Task PostCreate_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - //参数 - var para = new Account() {Id=100, Name="小明", Password="123456", Role="Admin" }; - - //请求体 - var plainContent = new StringContent(JsonConvert.SerializeObject(para), Encoding.UTF8, System.Net.Mime.MediaTypeNames.Application.Json); - - //发POST请求 - var responseMessage = await httpClient.PostAsync("/api/Normal/PostCreate", plainContent); - - //确保响应正常 - responseMessage.EnsureSuccessStatusCode(); - - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var text = await responseMessage.Content.ReadAsStringAsync(); - - var result = JsonConvert.DeserializeObject (text); - - Assert.IsType(result); - Assert.Equal(201, result.StatusCode); - Assert.IsType(result.Value); - - //新创建的对象 - var account = JsonConvert.DeserializeObject(value: result.Value.ToString() ?? ""); - - Assert.NotNull(account); - Assert.Equal(100,account.Id); - - //由于构造函数等原因,直接使用ReadFromJsonAsync,会异常。 - //CreatedAtActionResult? result = await responseMessage.Content.ReadFromJsonAsync(new JsonSerializerOptions() { IncludeFields=true, PropertyNameCaseInsensitive=true}); - } - - [Fact] - public async Task PostUpdate_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - //参数 - var para = new Account() { Id = 1, Name = "小明", Password = "123456", Role = "Admin" }; - - //发POST请求 - var responseMessage = await httpClient.PostAsJsonAsync("/api/Normal/PostUpdate", para); - - //确保响应正常 - responseMessage.EnsureSuccessStatusCode(); - - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - - Assert.Equal(1, result.Data?.Id); - } - - [Fact] - public async Task PostRemove_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var para_id = 2; - - //发POST请求(URL传参) - var responseMessage = await httpClient.PostAsync($"/api/Normal/PostRemove?Id={para_id}", null); - - //确保响应正常 - responseMessage.EnsureSuccessStatusCode(); - - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - - Assert.Equal(para_id, result.Data?.Id); - } - #endregion - - #region DELETE 请求 - - [Fact] - public async Task Delete_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var para_id = 2; - - //发POST请求(URL传参) - var responseMessage = await httpClient.DeleteAsync($"/api/Normal/Delete?Id={para_id}"); - - //确保响应正常 - responseMessage.EnsureSuccessStatusCode(); - - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - - Assert.Equal(para_id, result.Data); - } - - [Fact] - public async Task Delete2_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var account = new Account() { Id = 2, Name = "小明", Password = "123456", Role = "Admin" }; - - var requestMessage = new HttpRequestMessage(HttpMethod.Delete, "/api/Normal/DeleteForJsonData"); - //Delete 默认不使用请求体,如果使用的话,需要Content配合 RequestMessage - requestMessage.Content = JsonContent.Create(account); - - //也可以下面的,极少有使用(可自定义JsonSerializerOptions) - //requestMessage.Content = JsonContent.Create(account,JsonTypeInfo.CreateJsonTypeInfo( JsonSerializerOptions.Default),new System.Net.Http.Headers.MediaTypeHeaderValue("application/json","utf-8")); - - //发Delete请求(带json请求体) - var responseMessage = await httpClient.SendAsync(requestMessage); - - //确保响应正常 - responseMessage.EnsureSuccessStatusCode(); - - Assert.NotNull(responseMessage); - Assert.True(responseMessage.IsSuccessStatusCode); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result.Code); - } - #endregion - - #region OPTIONS 请求 - [Fact] - public async Task OPTIONS_Test() - { - HttpClient httpClient = new HttpClient() - { - BaseAddress = new Uri(TestConfig.WebApiBaseUrl), - }; - - var requestMessage = new HttpRequestMessage(HttpMethod.Options, "/api/Normal/OptionsSimple"); - - //响应 - var responseMessage = await httpClient.SendAsync(requestMessage); - - //响应正常 - Assert.True(responseMessage.IsSuccessStatusCode); - Assert.NotNull(responseMessage); - - var result = await responseMessage.Content.ReadFromJsonAsync>(); - Assert.IsType>(result); - Assert.Equal(1, result?.Code); - } - #endregion - - #region PATCH 请求 - #endregion - - #region TRACE 请求 - #endregion - - #region CONNECT 请求 - #endregion - } -} diff --git a/HttpClientStudy.UnitTest/UseXunit.cs b/HttpClientStudy.UnitTest/UseXunitTest.cs similarity index 82% rename from HttpClientStudy.UnitTest/UseXunit.cs rename to HttpClientStudy.UnitTest/UseXunitTest.cs index a1579ad..b7f5437 100644 --- a/HttpClientStudy.UnitTest/UseXunit.cs +++ b/HttpClientStudy.UnitTest/UseXunitTest.cs @@ -5,11 +5,11 @@ namespace HttpClientStudy.UnitTest /// /// ʹ xUnit ԪԿ /// - public class UseXunit + public class UseXunitTest { private readonly ITestOutputHelper _logger; - public UseXunit(ITestOutputHelper outputHelper) + public UseXunitTest(ITestOutputHelper outputHelper) { _logger = outputHelper; } diff --git a/HttpClientStudy.UnitTest/WebApp/BaseResultTest.cs b/HttpClientStudy.UnitTest/WebApp/BaseResultTest.cs index 20fe5e3..539a01d 100644 --- a/HttpClientStudy.UnitTest/WebApp/BaseResultTest.cs +++ b/HttpClientStudy.UnitTest/WebApp/BaseResultTest.cs @@ -1,4 +1,4 @@ -namespace HttpClientStudy.UnitTest.WebApp +namespace HttpClientStudy.UnitTest { public class BaseResultTest { diff --git a/HttpClientStudy.UnitTest/TestConfig.cs b/HttpClientStudy.UnitTest/WebApp/TestConfig.cs similarity index 100% rename from HttpClientStudy.UnitTest/TestConfig.cs rename to HttpClientStudy.UnitTest/WebApp/TestConfig.cs