using System.ComponentModel.DataAnnotations; using System.Text; using HttpClientStudy.WebApp.Models; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace HttpClientStudy.WebApp.Controllers { /// /// 高级Get请求 控制器 /// [Route("api/[controller]/[action]")] [ApiController] public class AdvancedGetController : ControllerBase { private ILogger _logger; /// /// 构造 /// public AdvancedGetController(ILogger logger) { _logger = logger; } /// /// GET请求接口 /// 携带请求正文:接口内直接读取Request.Body流 /// [HttpGet] public async Task GetWithBody() { if (Request.Body == null) { return new JsonResult(BaseResultUtil.Fail("没有请求体")); } if (Request.ContentLength <= 0) { return new JsonResult(BaseResultUtil.Fail("请求体中没有数据")); } using (var reader = new StreamReader(Request.Body, Encoding.UTF8, detectEncodingFromByteOrderMarks: false, bufferSize: 1024, leaveOpen: true)) { var requestBody = await reader.ReadToEndAsync(); //有关于请求体的业务逻辑 var result = BaseResultUtil.Success(requestBody); return Ok(result); } } /// /// GET请求接口 /// 携带请求正文:使用模型绑定 /// [HttpGet] public async Task GetWithFormBody([FromForm] int Id,[FromForm] string name) { var paras = $"{nameof(Id)}={Id}&{nameof(name)}={name}"; var result = BaseResultUtil.Success(paras); await Task.CompletedTask; return Ok(result); } /// /// GET请求接口 /// 携带请求正文:使用模型绑定 /// [HttpGet] public async Task GetWithJsonBody([FromBody] AdvancedGetModel vm) { var result = BaseResultUtil.Success(vm); await Task.CompletedTask; return Ok(result); } /// /// 接收带请求体数据的Get请求 /// 携带请求正文:模型绑定后 + 读取Request.Body流(复制流方式) /// [HttpGet] public async Task GetWithBodyByCopyStream([FromBody] AdvancedGetModel vm) { if (Request.Body == null) { return new JsonResult(BaseResultUtil.Fail("没有请求体")); } if (Request.ContentLength <= 0) { return new JsonResult(BaseResultUtil.Fail("请求体中没有数据")); } /* * 复制流方式 */ // 创建一个内存流存储请求体 using (var memStream = new MemoryStream()) { // 复制请求体到内存流 await HttpContext.Request.Body.CopyToAsync(memStream); // 重置内存流的位置,以便从头开始读取 memStream.Seek(0, SeekOrigin.Begin); // 从内存流中读取文本内容 using (var reader = new StreamReader(memStream)) { var requestBody = await reader.ReadToEndAsync(); // 现在你可以按照你的需要使用requestBody字符串 // 例如,将其作为响应返回 var result = BaseResultUtil.Success(requestBody); return Ok(result); } } } /// /// 接收带请求体数据的Get请求 /// 携带请求正文:模型绑定后 + 读取Request.Body流(启用倒带功能-推荐) /// /// [HttpGet] public async Task GetWithBodyByEnableBuffering([FromBody] AdvancedGetModel vm) { if (Request.Body == null) { return new JsonResult(BaseResultUtil.Fail("没有请求体")); } if (Request.ContentLength <= 0) { return new JsonResult(BaseResultUtil.Fail("请求体中没有数据")); } /* * 启用倒带功能,读取Request.Body流 * .net core 2.0 * Request.EnableRewind(); * * .net core 3+ * Request.EnableBuffering(); */ Request.EnableBuffering(); Request.Body.Position = 0; using (var reader = new StreamReader(Request.Body, Encoding.UTF8, detectEncodingFromByteOrderMarks: false, bufferSize: 1024, leaveOpen: true)) { var requestBody = await reader.ReadToEndAsync(); var result = BaseResultUtil.Success(requestBody); return Ok(result); } } /// /// Post 测试方法 /// 表单数据 /// /// [HttpPost] public IActionResult PostFormData([FromForm,Required]int Id, [FromForm,Required]string name) { var paras = $"{nameof(Id)}={Id}&{nameof(name)}={name}"; var result = BaseResultUtil.Success(paras); return Ok(result); } /// /// Post 测试方法 /// json 数据 /// /// [HttpPost] public IActionResult PostJsonData([FromBody]AdvancedGetModel? vm = null) { var result = BaseResultUtil.Success(vm); return Ok(result); } } }