diff --git a/Docs/1.3.2.基础使用.使用请求数据.ipynb b/Docs/1.3.2.基础使用.使用请求数据.ipynb index a7b8603..7864369 100644 --- a/Docs/1.3.2.基础使用.使用请求数据.ipynb +++ b/Docs/1.3.2.基础使用.使用请求数据.ipynb @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "metadata": { "dotnet_interactive": { "language": "csharp" @@ -59,9 +59,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "配置文件根目录:d:\\软件项目\\学习项目\\HttpClientStudy\\Docs\\Publish\\HttpClientStudy.Core\n", + "配置文件根目录:e:\\王高峰\\我的项目\\学习项目\\HttpClientStudy\\Docs\\Publish\\HttpClientStudy.Core\n", "启动WebApi项目\n", - "程序[d:\\软件项目\\学习项目\\HttpClientStudy\\Docs\\Publish\\HttpClientStudy.WebApp\\HttpClientStudy.WebApp.exe]已在新的命令行窗口执行。如果未出现新命令行窗口,可能是程序错误造成窗口闪现!\n" + "程序[e:\\王高峰\\我的项目\\学习项目\\HttpClientStudy\\Docs\\Publish\\HttpClientStudy.WebApp\\HttpClientStudy.WebApp.exe]已在新的命令行窗口执行。如果未出现新命令行窗口,可能是程序错误造成窗口闪现!\n" ] } ], @@ -117,6 +117,141 @@ "## 1、使用url 传参" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "参数放在Url里,形如:http://www.baidu.com?name=zhangsan&age=18, GET、Head请求用的比较多。优点是简单、方便,能被浏览器缓存;缺点是参数长度等限制较多,数据暴露url中,可能比较长。" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"data\":{\"id\":1,\"name\":\"管理员01\",\"password\":\"123456\",\"role\":\"Admin\"},\"code\":1,\"message\":\"成功\"}\r\n" + ] + }, + { + "data": { + "text/html": [ + "
HttpClientStudy.Model.BaseResult`1[HttpClientStudy.Model.Account]
Data
HttpClientStudy.Model.BaseResult`1[HttpClientStudy.Model.Account]
Code
1
Message
成功
Data
HttpClientStudy.Model.BaseResult`1[HttpClientStudy.Model.Account]
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
HttpClientStudy.Model.BaseResult`1[HttpClientStudy.Model.Account]
Data
HttpClientStudy.Model.BaseResult`1[HttpClientStudy.Model.Account]
Code
1
Message
成功
Data
HttpClientStudy.Model.BaseResult`1[HttpClientStudy.Model.Account]
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "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>();\n", + " result.Display();\n", + " }\n", + "\n", + " //直接获取响应对象\n", + " {\n", + " var result = await SharedClient.GetFromJsonAsync>(\"api/Normal/GetAccount?id=1\");\n", + " result.Display();\n", + " }\n", + " \n", + "}" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -124,6 +259,49 @@ "## 2、使用路由传参" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "路由参数,指参数使为URL的一部分,一般由后端API设定好,前端按规定使用即可。例如:后端指定/user/:id,前端使用/user/1,此时id为路由参数。" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"data\":{\"id\":1,\"name\":\"管理员01\",\"password\":\"123456\",\"role\":\"Admin\"},\"code\":1,\"message\":\"成功\"}\r\n" + ] + } + ], + "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", + "}" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -131,6 +309,62 @@ "## 3、使用请求头" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "把请求数据放入请求头中,传给后端。当然也可以传多个数据。不过,请求头中传数据限制比较多,一般只传简单的数据:比如jwt token 。" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"data\":{\"id\":1,\"name\":\"管理员01\",\"password\":\"123456\",\"role\":\"Admin\"},\"code\":1,\"message\":\"成功\"}\r\n" + ] + } + ], + "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", + "}" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -138,12 +372,98 @@ "## 4、使用Form表单" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "简单的Form表单,提交数据。其实是把数据放请求值的一种,后页有详细介绍。" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"data\":\"Id=1&name=管理员01\",\"code\":1,\"message\":\"成功\"}\r\n" + ] + } + ], + "source": [ + "/*\n", + "* Form表单,提交数据。一般为Put或Post提交。\n", + "*/\n", + "{\n", + " // 创建一个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", + "}" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5、使用请求体" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "把数据放在请求体中,发送到服务端。可以是简单的字符串,也可以是二进制数据(上传文件)、form表单项、编码过的form表单项、json、流式数据等形式,甚至是这个类型的组合。\n", + "所以请求体也分为这几种(常见的)类型:\n", + "1. StringContent\n", + "2. ByteArrayContent\n", + "3. FormUrlEncodedContent\n", + "4. JsonContent\n", + "5. StreamContent\n", + "6. MultipartContent\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "source": [ + "### StringContent 普通文本(也包括很多格式,甚至是自定义格式。要和服务器配合)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [], + "source": [ + "{\n", + " StringContent content = new StringContent(\"\",Encoding.UTF8, System.Net.Mime.MediaTypeNames.Text.Plain);\n", + "}" + ] } ], "metadata": { diff --git a/HttpClientStudy.WebApp/Controllers/AdvancedGetController.cs b/HttpClientStudy.WebApp/Controllers/AdvancedGetController.cs index 7d33b3e..61dd2c2 100644 --- a/HttpClientStudy.WebApp/Controllers/AdvancedGetController.cs +++ b/HttpClientStudy.WebApp/Controllers/AdvancedGetController.cs @@ -170,9 +170,9 @@ namespace HttpClientStudy.WebApp.Controllers /// /// [HttpPost] - public IActionResult PostFormData([FromForm,Required]int Id, [FromForm,Required]string name) + public IActionResult PostFormData([FromForm,Required]int id, [FromForm,Required]string name) { - var paras = $"{nameof(Id)}={Id}&{nameof(name)}={name}"; + var paras = $"{nameof(id)}={id}&{nameof(name)}={name}"; var result = BaseResultUtil.Success(paras); return Ok(result); } diff --git a/HttpClientStudy.WebApp/Controllers/NormalController.cs b/HttpClientStudy.WebApp/Controllers/NormalController.cs index 459a308..3b0e72c 100644 --- a/HttpClientStudy.WebApp/Controllers/NormalController.cs +++ b/HttpClientStudy.WebApp/Controllers/NormalController.cs @@ -133,6 +133,7 @@ namespace HttpClientStudy.WebApp.Controllers var result = BaseResultUtil.Success(account); return Ok(result); } + #endregion #region PUT