You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HttpClientStudy/Docs/1.3.2.基础使用.使用请求数据.ipynb

440 lines
12 KiB
Plaintext

7 months ago
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"source": [
"# HttpClient 使用请求数据"
]
},
{
"cell_type": "markdown",
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"source": [
"## 0、初始化及全局设置"
]
},
{
"cell_type": "code",
3 months ago
"execution_count": null,
7 months ago
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
3 months ago
"outputs": [],
7 months ago
"source": [
"//初始化,只执行一次\n",
"\n",
"// 引用nuget包和类库文件\n",
3 months ago
"//#r \"nuget:Microsoft.Net.Http.Headers,8.0.12\"\n",
"//#r \"nuget:Microsoft.Extensions.Http,8.0.1\"\n",
"//#r \"nuget:System.Net.Http.Json,8.0.1\"\n",
7 months ago
"#r \"./Publish/HttpClientStudy.Model/HttpClientStudy.Model.dll\"\n",
"#r \"./Publish/HttpClientStudy.Core/HttpClientStudy.Core.dll\"\n",
"\n",
"//全局引用\n",
"global using System;\n",
"global using System.Collections;\n",
"global using System.Linq;\n",
"global using System.Linq.Expressions;\n",
"global using System.Threading;\n",
"global using System.Threading.Tasks;\n",
"global using System.Net.Http;\n",
"global using System.Net.Mime;\n",
"global using System.Net.Http.Json;\n",
"\n",
"global using HttpClientStudy.Config;\n",
"global using HttpClientStudy.Model;\n",
"global using HttpClientStudy.Core;\n",
"global using HttpClientStudy.Core.Utilities;\n",
"\n",
"//全局变量\n",
"var webApiBaseUrl = WebApiConfigManager.GetWebApiConfig().BaseUrl;\n",
"var workDir = Environment.CurrentDirectory;\n",
"var fullPath = System.IO.Path.GetFullPath(\"./Publish/HttpClientStudy.WebApp/HttpClientStudy.WebApp.exe\", workDir);\n",
"\n",
"//全局共享静态 HttpClient 对象\n",
"public static HttpClient SharedClient = new HttpClient(new SocketsHttpHandler(){ PooledConnectionIdleTimeout = TimeSpan.FromSeconds(30)})\n",
"{\n",
" BaseAddress = new Uri(WebApiConfigManager.GetWebApiConfig().BaseUrl),\n",
"};\n",
"\n",
"//启动已发布的WebApi项目\n",
"{\n",
" Console.WriteLine(\"启动WebApi项目\");\n",
" var startMessage = AppUtility.RunWebApiExeFile(fullPath);\n",
" Console.WriteLine(startMessage);\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1、使用url 传参"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"参数放在Url里形如http://www.baidu.com?name=zhangsan&age=18, GET、Head请求用的比较多。优点是简单、方便能被浏览器缓存缺点是参数长度等限制较多数据暴露url中可能比较长。"
]
},
{
"cell_type": "code",
3 months ago
"execution_count": null,
"metadata": {
7 months ago
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
3 months ago
"outputs": [],
"source": [
"/**\n",
" URL传参适合简单数据类型\n",
"*/\n",
"{\n",
" //获取响应字符串\n",
" {\n",
" var response = await SharedClient.GetAsync(\"api/Normal/GetAccount?id=1\");\n",
" response.EnsureSuccessStatusCode();\n",
" var content = await response.Content.ReadAsStringAsync();\n",
" Console.WriteLine(content);\n",
" }\n",
"\n",
" //获取响应对象\n",
" {\n",
" var response = await SharedClient.GetAsync(\"api/Normal/GetAccount?id=1\");\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" var result = await response.Content.ReadFromJsonAsync<BaseResult<Account>>();\n",
" result.Display();\n",
" }\n",
"\n",
" //直接获取响应对象\n",
" {\n",
" var result = await SharedClient.GetFromJsonAsync<BaseResult<Account>>(\"api/Normal/GetAccount?id=1\");\n",
" result.Display();\n",
" }\n",
" \n",
"}"
]
},
7 months ago
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2、使用路由传参"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"路由参数指参数使为URL的一部分一般由后端API设定好前端按规定使用即可。例如后端指定/user/:id前端使用/user/1此时id为路由参数。"
]
},
{
"cell_type": "code",
3 months ago
"execution_count": null,
"metadata": {
7 months ago
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
3 months ago
"outputs": [],
"source": [
"/*\n",
"** 路由参数参数是URL的一部分,由后端指定\n",
"*/\n",
"{//大括号:方便折叠、开成单独的作用域\n",
"\n",
" var response = await SharedClient.GetAsync(\"api/Normal/GetAccount/管理员01\");\n",
" \n",
" //确定是成功的响应\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" //获取响应内容\n",
" var content = await response.Content.ReadAsStringAsync();\n",
"\n",
" //输出 \n",
" Console.WriteLine(content);\n",
"}"
]
},
7 months ago
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3、使用请求头"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"把请求数据放入请求头中传给后端。当然也可以传多个数据。不过请求头中传数据限制比较多一般只传简单的数据比如jwt token 。"
]
},
{
"cell_type": "code",
3 months ago
"execution_count": null,
"metadata": {
7 months ago
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
3 months ago
"outputs": [],
"source": [
"/*\n",
"* 请求头: 值必须是字符串,如果有中文等需进行编码\n",
"*/\n",
"{\n",
" //设置请求头\n",
"\n",
" //中文先编码,服务端接收后要解码\n",
" var codedName = System.Net.WebUtility.UrlEncode(\"管理员01\");\n",
"\n",
" //SharedClient是共用的所以不能多次添加,先移除旧值\n",
" if (SharedClient.DefaultRequestHeaders.Contains(\"name\"))\n",
" {\n",
" SharedClient.DefaultRequestHeaders.Remove(\"name\");\n",
" }\n",
" \n",
" //添加请求头\n",
" SharedClient.DefaultRequestHeaders.Add(\"name\", codedName);\n",
"\n",
" var response = await SharedClient.GetAsync(\"api/Normal/GetAccountFromHeader\");\n",
" \n",
" //确定是成功的响应\n",
" response.EnsureSuccessStatusCode();\n",
"\n",
" //获取响应内容\n",
" var content = await response.Content.ReadAsStringAsync();\n",
"\n",
" //输出 \n",
" Console.WriteLine(content);\n",
"}"
]
},
7 months ago
{
"cell_type": "markdown",
"metadata": {},
"source": [
7 months ago
"## 4、使用请求体"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"把数据放在请求体中,发送到服务端。可以是简单的字符串,也可以是二进制数据(上传文件)、form表单项、编码过的form表单项、json、流式数据等形式甚至是这个类型的组合。\n",
"\n",
"说下个人的几点理解:\n",
"1、不管哪种请求体数据都是放在请求体中以二进制形式通过网络发往服务器由服务器接收使用。客户端发送请求数据需要与服务端接收相配合\n",
"2、客户端通过Content-Typey请求头设置告诉服务端请求发送的是哪种类型的数据;服务端根据Content-Type来识别、解析请求数据。常见的类型有multipart/form-data、application/x-www-form-urlencoded、application/json、text/plain等\n",
"3、ASP.NET Core中默认的请求体类型是FormUrlEncodedContent所以默认情况下客户端发送的请求数据是form表单项; asp.net 框架对json格式数据和表单数据进行了特殊处理支持参数绑定等可以使用[FromBody]特性,将请求数据绑定到对应的模型上。但普通的文本类型等不支持绑定等功能,需要从请求体中获取原始数据,自行处理。\n",
"4、一次可发送多种格式数据由统一的分隔符分隔。服务端可以从请求头[] Content-Type: multipart/mixed; boundary=\"d2e38916-df08-4fec-a40e-3e5179736f32\"]拿到分隔符,然后根据分隔符将数据拆分出来。\n",
"\n",
"HttpClient 中,请求体也分为这几种(常见的)类型:\n",
"1. MultipartFormDataContent\n",
"2. FormUrlEncodedContent\n",
"3. JsonContent\n",
"4. StringContent\n",
"5. ByteArrayContent\n",
"6. StreamContent\n",
"7. MultipartContent"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### MultipartFormDataContent Form表单"
7 months ago
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
7 months ago
"Form表单提交数据方式之一。"
]
},
{
"cell_type": "code",
3 months ago
"execution_count": null,
"metadata": {
3 months ago
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
3 months ago
"outputs": [],
"source": [
"/*\n",
"* Form表单提交数据。一般为Put或Post提交。\n",
"*/\n",
"{\n",
7 months ago
" // 创建一个 MultipartFormDataContent 对象, 用来存入 Form表单 各项及值\n",
" var formContent = new MultipartFormDataContent();\n",
" \n",
" // 添加表单字段\n",
" formContent.Add(new StringContent(\"1\"), \"id\");\n",
" formContent.Add(new StringContent(\"管理员01\"), \"name\");\n",
" \n",
" // 发送POST请求\n",
" var response = await SharedClient.PostAsync(\"api/AdvancedGet/PostFormData\", formContent);\n",
" \n",
" // 读取响应内容\n",
" string responseString = await response.Content.ReadAsStringAsync();\n",
" \n",
" Console.WriteLine(responseString);\n",
"}"
]
},
7 months ago
{
"cell_type": "markdown",
"metadata": {},
"source": [
7 months ago
"### FormUrlEncodedContent Form表单 asp.net core 默认接收方式"
7 months ago
]
},
{
7 months ago
"cell_type": "code",
3 months ago
"execution_count": 6,
7 months ago
"metadata": {
3 months ago
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
7 months ago
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
7 months ago
"/*\n",
" \n",
"*/\n",
"{\n",
"\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {
"vscode": {
"languageId": "polyglot-notebook"
}
},
"source": [
"### StringContent 普通文本(也包括很多格式,甚至是自定义格式。要和服务器配合)\n"
]
},
{
"cell_type": "code",
3 months ago
"execution_count": null,
"metadata": {
7 months ago
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
3 months ago
"outputs": [],
"source": [
7 months ago
"/*\n",
" \n",
"*/\n",
"{\n",
7 months ago
" var requestContent = new StringContent(\"我是请求体第一段内容\", Encoding.UTF8, \"text/plain\");\n",
"\n",
" var response = await SharedClient.PostAsync(\"/api/AdvancedPost/TextData\", requestContent);\n",
"\n",
" var content = await response.Content.ReadAsStringAsync();\n",
"\n",
" Console.WriteLine(content);\n",
"}"
]
7 months ago
}
],
"metadata": {
"kernelspec": {
"display_name": ".NET (C#)",
"language": "C#",
"name": ".net-csharp"
},
"language_info": {
"name": "python"
},
"polyglot_notebook": {
"kernelInfo": {
"defaultKernelName": "csharp",
"items": [
{
"aliases": [],
"name": "csharp"
}
]
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}