diff --git a/HttpClientStudy.Core/Class1.cs b/HttpClientStudy.Core/Class1.cs deleted file mode 100644 index 5fc3f40..0000000 --- a/HttpClientStudy.Core/Class1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace HttpClientStudy.Core -{ - public class Class1 - { - - } -} diff --git a/HttpClientStudy.Core/SimpleHttpClient.cs b/HttpClientStudy.Core/SimpleHttpClient.cs new file mode 100644 index 0000000..30336fd --- /dev/null +++ b/HttpClientStudy.Core/SimpleHttpClient.cs @@ -0,0 +1,102 @@ +using System.Net.Http.Headers; +using System.Net.Http.Json; +using System.Net.Http; +using System.Net.Mime; +using System.Net; + +namespace HttpClientStudy.Core +{ + /// <summary> + /// 简单 HttpClient 包装类 + /// </summary> + public class SimpleHttpClient + { + public string Get(string url) + { + HttpClient client = new HttpClient(); + //可以统一设置HttpClient属性:HttpClient可以使用统一设置进行多次请求。 + //client.BaseAddress = new Uri(url); + //client.DefaultRequestHeaders.Add("Accept", "application/json"); + //client.DefaultRequestVersion = HttpVersion.Version10; + //client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; + //client.Timeout = TimeSpan.FromSeconds(60); + //client.CancelPendingRequests(); + + //只有Send是同步方法,其它全为异步方法。 + + //Send同步方法,需要HttpRequestMessage参数 + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); + var response = client.Send(request); + + response.EnsureSuccessStatusCode(); + //或者 + if (response.IsSuccessStatusCode) + { + //业务逻辑 + } + + //状态码 + if (response is { StatusCode: HttpStatusCode.OK }) + { + //业务逻辑 + } + + //请求头 + if(response is { Headers.ETag:null}) + { + //业务逻辑 + } + + var result = response.Content.ReadAsStringAsync().Result; + + return result; + } + + public async Task<string> GetAsync(string url) + { + HttpClient client = new HttpClient(); + var response = await client.GetAsync(url); + + response.EnsureSuccessStatusCode(); + + var result = await response.Content.ReadAsStringAsync(); + + return result; + } + + public TResult? GetJson<TResult>(string url) + { + HttpClient client = new HttpClient(); + + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); + var response = client.Send(request); + + response.EnsureSuccessStatusCode(); + if (response.Content.Headers.ContentType?.MediaType != MediaTypeNames.Application.Json) + { + throw new HttpRequestException("响应不是 json 格式!"); + } + + var result = response.Content.ReadFromJsonAsync<TResult>().Result; + + return result; + } + + public async Task<TResult?> GetJsonAsync<TResult>(string url) + { + HttpClient client = new HttpClient(); + + var response = await client.GetAsync(url); + + response.EnsureSuccessStatusCode(); + if (response.Content.Headers.ContentType?.MediaType != MediaTypeNames.Application.Json) + { + throw new HttpRequestException("响应不是 json 格式!"); + } + + var result = await response.Content.ReadFromJsonAsync<TResult>(); + + return result; + } + } +} diff --git a/HttpClientStudy.UnitTest/Core/SimpleHttpClientTest.cs b/HttpClientStudy.UnitTest/Core/SimpleHttpClientTest.cs new file mode 100644 index 0000000..20f270c --- /dev/null +++ b/HttpClientStudy.UnitTest/Core/SimpleHttpClientTest.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HttpClientStudy.UnitTest.Core +{ + /// <summary> + /// SimpleHttpClient 测试类 + /// </summary> + public class SimpleHttpClientTest + { + private readonly ITestOutputHelper _logger; + public SimpleHttpClientTest(ITestOutputHelper outputHelper) + { + _logger = outputHelper; + } + + [Fact] + public void Get_Test() + { + SimpleHttpClient client = new SimpleHttpClient(); + + var result = client.Get("http://localhost:5000/api/Simple/GetAccount"); + + Assert.NotNull(result); + Assert.NotEmpty(result); + } + + [Fact] + public void Test() + { + SimpleHttpClient client = new SimpleHttpClient(); + + var result = client.GetJson<BaseResult<string>>("http://localhost:5000/api/Simple/GetAccount"); + + Assert.NotNull(result); + Assert.IsAssignableFrom<BaseResult>(result); + Assert.Equal(1, result.Code); + Assert.Contains("成功", result.Message); + Assert.IsType<string>(result.Message); + Assert.NotEmpty(result.Message); + } + + + } +} diff --git a/HttpClientStudy.WebApp/.config/dotnet-tools.json b/HttpClientStudy.WebApp/.config/dotnet-tools.json new file mode 100644 index 0000000..e3cadb9 --- /dev/null +++ b/HttpClientStudy.WebApp/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "8.0.0", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/HttpClientStudy.WebApp/BaseResult.cs b/HttpClientStudy.WebApp/BaseResult.cs index 0fe2df0..1407778 100644 --- a/HttpClientStudy.WebApp/BaseResult.cs +++ b/HttpClientStudy.WebApp/BaseResult.cs @@ -12,7 +12,6 @@ namespace HttpClientStudy.WebApp /// </summary> public int Code { get; set; } - /// <summary> /// <summary> /// 接口返回说明信息 /// </summary> @@ -30,11 +29,21 @@ namespace HttpClientStudy.WebApp /// <typeparam name="T"></typeparam> public class BaseResult<T> : BaseResult { + /// <summary> + /// 创建返回基数 + /// </summary> + /// <param name="data">泛型数据</param> + /// <param name="code">编码</param> + /// <param name="message">说明信息</param> + /// <returns></returns> public static BaseResult<T> Create(T? data = default, int code = 0, string message = "") { return new BaseResult<T> { Data = data, Code = code, Message = message }; } + /// <summary> + /// 泛型返回核心数据 + /// </summary> public new T? Data { get; set; } } @@ -154,7 +163,6 @@ namespace HttpClientStudy.WebApp /// <summary> /// 创建 泛型异常返回基类 /// </summary> - public static BaseResult<TData> Exception<TData>(Exception ex, TData? data, int code = 0) { return new BaseResult<TData>() { Data = data, Code = code, Message = $"异常:{ex.Message}" };