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.

193 lines
6.0 KiB
C#

9 months ago
using System.ComponentModel.DataAnnotations;
using System.Text;
using HttpClientStudy.WebApp.Models;
9 months ago
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace HttpClientStudy.WebApp.Controllers
{
/// <summary>
/// 高级Get请求 控制器
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class AdvancedGetController : ControllerBase
{
private ILogger<SimpleController> _logger;
/// <summary>
/// 构造
/// </summary>
public AdvancedGetController(ILogger<SimpleController> logger)
{
_logger = logger;
}
/// <summary>
9 months ago
/// GET请求接口
/// 携带请求正文接口内直接读取Request.Body流
/// </summary>
[HttpGet]
public async Task<IActionResult> 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);
}
}
/// <summary>
/// GET请求接口
/// 携带请求正文:使用模型绑定
/// </summary>
[HttpGet]
public async Task<IActionResult> GetWithFormBody([FromForm] int Id,[FromForm] string name)
{
9 months ago
AdvancedGetModel vm = new AdvancedGetModel() { Id = Id, Name = name };
var result = BaseResultUtil.Success(vm);
9 months ago
await Task.CompletedTask;
return Ok(result);
}
/// <summary>
/// GET请求接口
/// 携带请求正文:使用模型绑定
/// </summary>
[HttpGet]
public async Task<IActionResult> GetWithJsonBody([FromBody] AdvancedGetModel vm)
{
var result = BaseResultUtil.Success(vm);
await Task.CompletedTask;
return Ok(result);
}
/// <summary>
/// 接收带请求体数据的Get请求
/// 携带请求正文:模型绑定后 + 读取Request.Body流(复制流方式)
9 months ago
/// </summary>
[HttpGet]
9 months ago
public async Task<IActionResult> GetWithBodyByCopyStream([FromBody] AdvancedGetModel vm)
9 months ago
{
9 months ago
if (Request.Body == null)
{
return new JsonResult(BaseResultUtil.Fail("没有请求体"));
}
9 months ago
9 months ago
if (Request.ContentLength <= 0)
9 months ago
{
9 months ago
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))
9 months ago
{
9 months ago
var requestBody = await reader.ReadToEndAsync();
// 现在你可以按照你的需要使用requestBody字符串
// 例如,将其作为响应返回
var result = BaseResultUtil.Success(requestBody);
return Ok(result);
9 months ago
}
9 months ago
}
9 months ago
}
/// <summary>
/// 接收带请求体数据的Get请求
/// 携带请求正文:模型绑定后 + 读取Request.Body流(启用倒带功能-推荐)
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> 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();
9 months ago
9 months ago
var result = BaseResultUtil.Success(requestBody);
return Ok(result);
}
}
/// <summary>
/// Post 测试方法
/// 表单数据
/// </summary>
/// <returns></returns>
[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);
9 months ago
return Ok(result);
}
9 months ago
9 months ago
/// <summary>
9 months ago
/// Post 测试方法
/// json 数据
9 months ago
/// </summary>
/// <returns></returns>
9 months ago
[HttpPost]
9 months ago
public IActionResult PostJsonData([FromBody]AdvancedGetModel? vm)
9 months ago
{
9 months ago
var result = BaseResultUtil.Success(vm);
9 months ago
return Ok(result);
9 months ago
}
}
}