From 5741f7adf623f99b5f68a61cc5a9edf837c4d2e2 Mon Sep 17 00:00:00 2001
From: wanggaofeng <15601716045@163.com>
Date: Sun, 7 Jan 2024 19:45:24 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../NormalHttpClientTest.cs                   | 165 +++++++++++++++++-
 1 file changed, 163 insertions(+), 2 deletions(-)

diff --git a/HttpClientStudy.UnitTest/NormalHttpClientTest.cs b/HttpClientStudy.UnitTest/NormalHttpClientTest.cs
index 15df1a5..c870b42 100644
--- a/HttpClientStudy.UnitTest/NormalHttpClientTest.cs
+++ b/HttpClientStudy.UnitTest/NormalHttpClientTest.cs
@@ -5,6 +5,12 @@ 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;
 
 namespace HttpClientStudy.UnitTest
 {
@@ -20,7 +26,7 @@ namespace HttpClientStudy.UnitTest
             _logger = outputHelper;
         }
 
-        #region Get请求
+        #region GET请求
 
         [Fact]
         public async Task GetAllAccounts_Test()
@@ -208,6 +214,26 @@ namespace HttpClientStudy.UnitTest
             Assert.Equal(1, result.Code);
             Assert.Equal("服务注入示例",result.Data?.Name);
         }
+
+        /// <summary>
+        /// GET 请求
+        /// (直接调用System.Net.Http.Json类的扩展方法GetFromJsonAsync 获取 Json 结果)
+        /// </summary>
+        /// <returns></returns>
+        [Fact]
+        public async Task Get_From_Json_Test()
+        {
+            HttpClient httpClient = new HttpClient()
+            {
+                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
+            };
+
+            var result = await httpClient.GetFromJsonAsync<BaseResult<Account>>("/api/Normal/GetAccountFromServices");
+
+            Assert.IsType<BaseResult<Account>>(result);
+            Assert.Equal(1, result.Code);
+            Assert.Equal("服务注入示例", result.Data?.Name);
+        }
         #endregion
 
         #region PUT 请求
@@ -266,5 +292,140 @@ namespace HttpClientStudy.UnitTest
             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<BaseResult<string>>();
+            Assert.IsType<BaseResult<string>>(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<CreatedAtActionResult> (text);
+
+            Assert.IsType<CreatedAtActionResult>(result);
+            Assert.Equal(201, result.StatusCode);
+            Assert.IsType<Newtonsoft.Json.Linq.JObject>(result.Value);
+
+            //新创建的对象
+            var account = JsonConvert.DeserializeObject<Account>(value: result.Value.ToString() ?? "");
+
+            Assert.NotNull(account);
+            Assert.Equal(100,account.Id);
+
+            //由于构造函数等原因,直接使用ReadFromJsonAsync,会异常。
+            //CreatedAtActionResult? result = await responseMessage.Content.ReadFromJsonAsync<CreatedAtActionResult>(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<BaseResult<Account>>();
+            Assert.IsType<BaseResult<Account>>(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<BaseResult<Account>>();
+            Assert.IsType<BaseResult<Account>>(result);
+            Assert.Equal(1, result.Code);
+
+            Assert.Equal(para_id, result.Data?.Id);
+        }
+        #endregion
+
+        #region DELETE 请求
+        #endregion
+
+        #region OPTIONS 请求
+        #endregion
+
+        #region PATCH 请求
+        #endregion
+
+        #region TRACE 请求
+        #endregion
+
+        #region CONNECT 请求
+        #endregion
     }
-}
+}