@ -69,6 +69,7 @@
"global using Microsoft.Extensions.DependencyInjection.Extensions;\n",
"global using Microsoft.Extensions.DependencyInjection.Extensions;\n",
"\n",
"\n",
"global using HttpClientStudy.Config;\n",
"global using HttpClientStudy.Config;\n",
"global using HttpClientStudy.Model;\n",
"global using HttpClientStudy.Core;\n",
"global using HttpClientStudy.Core;\n",
"global using HttpClientStudy.Core.Utilities;\n",
"global using HttpClientStudy.Core.Utilities;\n",
"\n",
"\n",
@ -262,6 +263,12 @@
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"metadata": {
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"vscode": {
"languageId": "polyglot-notebook"
"languageId": "polyglot-notebook"
}
}
@ -288,7 +295,7 @@
"cell_type": "markdown",
"cell_type": "markdown",
"metadata": {},
"metadata": {},
"source": [
"source": [
"## Http Get Json"
"## Http Get Json"
]
]
},
},
{
{
@ -303,6 +310,12 @@
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": null,
"metadata": {
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"vscode": {
"languageId": "polyglot-notebook"
"languageId": "polyglot-notebook"
}
}
@ -310,6 +323,7 @@
"outputs": [],
"outputs": [],
"source": [
"source": [
"/*\n",
"/*\n",
" 方式一:使用 System.Net.Http.Json\n",
" Get Json\n",
" Get Json\n",
" 需要先引入 System.Net.Http.Json 和 命名空间(全局设置里已完成)\n",
" 需要先引入 System.Net.Http.Json 和 命名空间(全局设置里已完成)\n",
"*/\n",
"*/\n",
@ -320,6 +334,340 @@
"\n",
"\n",
" //框架显示方法\n",
" //框架显示方法\n",
" content.Display();\n",
" content.Display();\n",
"}\n",
"\n",
"/*\n",
" 方式二: ReadFromJsonAsync 方法,读取响应内容(HttpResonseMessage.Content)\n",
"*/\n",
"{\n",
" var response = await SharedClient.GetAsync(\"/api/hello/GetAccount\");\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var content = await response.Content.ReadFromJsonAsync<HttpClientStudy.Model.Account>();\n",
" content.Display();\n",
"}\n",
"\n",
"/*\n",
" 方式三:手动序列化读取的响应内容\n",
"*/\n",
"{\n",
" var response = await SharedClient.GetAsync(\"/api/hello/GetAccount\");\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var content = await response.Content.ReadAsStringAsync();\n",
" \n",
" var account = System.Text.Json.JsonSerializer.Deserialize<HttpClientStudy.Model.Account>(content);\n",
" account.Display();\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Post"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"POST 请求将数据发送到服务器进行处理。 请求的 Content-Type 标头表示正文发送的 MIME 类型。 要在给定 HttpClient 和 Uri 的情况下发出 HTTP POST 请求,请使用 HttpClient.PostAsync 方法.\n",
"请求数据可选:包括 请求URL、路由、请求头、请求体(包括多种方式,后面详解)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"//不带请求体\n",
"{\n",
" var response = await SharedClient.PostAsync(\"/api/hello/Post\",null);\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var context = await response.Content.ReadAsStringAsync();\n",
"\n",
" Console.WriteLine(context);\n",
"}\n",
"\n",
"//带请求体\n",
"{\n",
" var account = new Account()\n",
" {\n",
" Id =0,\n",
" Name = \"小王\",\n",
" };\n",
"\n",
" //请求体有很多:后面专门章节讲解\n",
" var requestContent = new StringContent(System.Text.Json.JsonSerializer.Serialize(account), System.Text.Encoding.UTF8, System.Net.Mime.MediaTypeNames.Application.Json);\n",
"\n",
" var response = await SharedClient.PostAsync(\"/api/hello/AddAccount\", requestContent);\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var context = await response.Content.ReadAsStringAsync();\n",
"\n",
" Console.WriteLine(context);\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Put"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"PUT 请求方法会替换现有资源,或使用请求正文有效负载创建一个新资源。 要在给定 HttpClient 和 URI 的情况下发出 HTTP PUT 请求,请使用 HttpClient.PutAsync 方法。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"/* Put请求, 一般是添加或修改资源:需要数据。\n",
" 这里故意使用查询,没有资源:\n",
" 意在说明: Get、Post、Put等谓词的使用,只是行业规范(有些服务器做了特殊处理), 不具有强制性。并且, 从http协议上说, 没有本质区别。 \n",
"*/\n",
"{\n",
" var response = await SharedClient.PutAsync(\"/api/Normal/PutDemo?id=2\", null);\n",
"\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var content = await response.Content.ReadAsStringAsync();\n",
" Console.WriteLine(content);\n",
"\n",
" //或者直接获取对象\n",
" var result = await response.Content.ReadFromJsonAsync<BaseResult<Account>>();\n",
" result.Display();\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Head"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"HEAD 请求类似于请求 GET。 它只返回与资源关联的标头,而不返回资源。 对 HEAD 请求的响应不会返回正文。 \n",
"要在给定 HttpClient 和 URI 的情况下发出 HTTP HEAD 请求,请使用 HttpClient.SendAsync 方法并将 HttpMethod 设置为 HttpMethod.Head \n",
"注意: 系统没有提供单独的Head方法, 要使用通用的Send或者SendAsync"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"//Head请求, 借助SendAsync方法\n",
"{\n",
" var requestMessage = new HttpRequestMessage(HttpMethod.Head, \"/api/Normal/HeadDemo?id=2\");\n",
"\n",
" var response = await SharedClient.SendAsync(requestMessage);\n",
"\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" //Head请求, 没有响应内容。\n",
" var content = await response.Content.ReadAsStringAsync();\n",
" Console.WriteLine(response.Content.Headers.ContentLength > 0 ? \"有响应体\":\"无响应体\");\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Patch"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"PATCH 请求是对现有资源执行部分更新。 它不会创建新资源,也不会替换现有资源。 而是只更新部分资源。 要在给定 HttpClient 和 URI 的情况下发出 HTTP PATCH 请求,请使用 HttpClient.PatchAsync 方法"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"//Patch请求\n",
"{\n",
" var account = new Account()\n",
" {\n",
" Id = 1,\n",
" Name = \"Patch更新\"\n",
" };\n",
"\n",
" StringContent jsonContent = new(System.Text.Json.JsonSerializer.Serialize(account), Encoding.UTF8, System.Net.Mime.MediaTypeNames.Application.JsonPatch);\n",
"\n",
" HttpResponseMessage response = await SharedClient.PatchAsync( \"api/Normal/PatchDemo\", jsonContent);\n",
"\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var context = await response.Content.ReadAsStringAsync();\n",
" Console.WriteLine($\"{context}\");\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Delete"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"DELETE 请求会删除现有资源。 DELETE 请求是幂等的但不是安全的,这意味着对同一资源发出的多个 DELETE 请求会产生相同的结果,但该请求会影响资源的状态。 要在给定 HttpClient 和 URI 的情况下发出 HTTP DELETE 请求,请使用 HttpClient.DeleteAsync 方法."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"//Delete 删除资源\n",
"{\n",
" HttpResponseMessage response = await SharedClient.DeleteAsync( \"api/Normal/Delete?id=1\");\n",
"\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var context = await response.Content.ReadAsStringAsync();\n",
" Console.WriteLine($\"{context}\");\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Options"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"OPTIONS 请求用于标识服务器或终结点支持哪些 HTTP 方法。 要在给定 HttpClient 和 URI 的情况下发出 HTTP OPTIONS 请求,请使用 HttpClient.SendAsync 方法并将 HttpMethod 设置为 HttpMethod.Options"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"//Options 预检请求\n",
"{\n",
" var requestMessage = new HttpRequestMessage(HttpMethod.Options, \"api/Normal/OptionsSimple\");\n",
"\n",
" HttpResponseMessage response = await SharedClient.SendAsync(requestMessage);\n",
"\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var context = await response.Content.ReadAsStringAsync();\n",
" Console.WriteLine($\"{context}\");\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Trace"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"TRACE 请求可用于调试,因为它提供请求消息的应用程序级环回。 要发出 HTTP TRACE 请求,请使用 HttpMethod.Trace 创建 HttpRequestMessage\n",
"特别注意: ASP.NET WebApi 并不直接支持 Trace 请求; 一个简单方法是使用一个专用的中间件, 来支持所有接口的Trace请求.(需要服务器支持)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"//trace 服务器已设置专门中间件支持所有接口的Trace请求\n",
"{\n",
" var requestMessage = new HttpRequestMessage(HttpMethod.Trace,\"api/Normal/TraceDemo?accountId=1\");\n",
" requestMessage.Content = new StringContent(\"我是请求内容\",Encoding.UTF8,System.Net.Mime.MediaTypeNames.Text.Plain);\n",
"\n",
" var response = await SharedClient.SendAsync(requestMessage);\n",
"\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var context = await response.Content.ReadAsStringAsync();\n",
"\n",
" Console.WriteLine(context);\n",
"}"
"}"
]
]
}
}