WEBAPI HTTP请求中所有的参数去除空格
WEBAPI HTTP请求中所有的参数去除空格
反正总会有一些沙雕需求。
总体思路就是要么中间件要么aop,拦截请求,对请求的参数做处理。
不知道大佬们有没有什么其他的思路来做,或者有更优的代码。
效果

调用方式
// 添加中间件,去掉请求中的空格
app.UseTrimRequest();
实现代码
using System.Text;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class TrimWhitespaceMiddleware
{
private readonly RequestDelegate _next;
public TrimWhitespaceMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (HttpMethods.IsGet(context.Request.Method) || HttpMethods.IsHead(context.Request.Method))
{
var originalQuery = context.Request.Query;
var newQuery = originalQuery.ToDictionary(
x => x.Key,
x => x.Value.ToString().Trim()
);
context.Request.QueryString = QueryString.Create(newQuery);
}
else if (HttpMethods.IsPost(context.Request.Method) ||
HttpMethods.IsPut(context.Request.Method) ||
HttpMethods.IsDelete(context.Request.Method) ||
HttpMethods.IsPatch(context.Request.Method))
{
if (context.Request.HasFormContentType)
{
var form = await context.Request.ReadFormAsync();
context.Request.Form = new FormCollection(form
.ToDictionary(x => x.Key, x => new StringValues(x.Value.ToString().Trim())));
}
else
{
using var reader = new StreamReader(context.Request.Body, Encoding.UTF8, false, 1024, true);
string bodyAsString = await reader.ReadToEndAsync();
var bodyAsJson = JObject.Parse(bodyAsString);
await RemoveSpacesFromBodyAsync(bodyAsJson);
string newBody = JsonConvert.SerializeObject(bodyAsJson, Formatting.None);
byte[] newBodyBytes = Encoding.UTF8.GetBytes(newBody);
context.Request.Body = new MemoryStream(newBodyBytes);
context.Request.ContentLength = newBodyBytes.LongLength;
context.Request.ContentType = "application/json";
}
}
await _next.Invoke(context);
}
private static async Task RemoveSpacesFromBodyAsync(JObject body)
{
foreach (var property in body.Properties())
{
switch (property.Value)
{
case JValue { Type: JTokenType.String } jValue:
property.Value = jValue.Value?.ToString()?.Trim();
break;
case JObject { } jObject:
await RemoveSpacesFromBodyAsync(jObject);
break;
case JArray { } jArray:
await foreach (var item in GetObjectsInJArray(jArray))
{
await RemoveSpacesFromBodyAsync(item);
}
break;
}
}
}
private static async IAsyncEnumerable<JObject> GetObjectsInJArray(JArray jArray)
{
foreach (var item in jArray)
{
if (item is JObject obj)
{
yield return obj;
}
}
}
}
public static class TrimRequestMiddlewareExtensions
{
public static IApplicationBuilder UseTrimRequest(this IApplicationBuilder builder)
{
return builder.UseMiddleware<TrimWhitespaceMiddleware>();
}
}
WEBAPI HTTP请求中所有的参数去除空格的更多相关文章
- 自动匹配HTTP请求中对应实体参数名的数据(性能不是最优)
/// <summary> /// 获取请求参数字段 /// </summary> /// <typeparam name="T"></t ...
- springboot的restful风格获取请求中携带的参数
http://localhost:8080/emp/1 有以上请求,我们controller要怎么获取请求中传递的参数1呢? 通过PathVariable注解,如下: @DeleteMapping(& ...
- 【原创】http请求中加号被替换为空格?源码背后的秘密
这是why技术的第**20**篇原创文章去除空格
str为要去除空格的字符串: 去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/ ...
- Jquery中Ajax异步请求中的async参数的作用
之前不知道这个参数的作用,上网找了前辈的博客,在此收录到自己的博客,希望能帮到更多的朋友: test.html <a href="javascript:void(0)" on ...
- JMeter怎么在get URL请求、POST请求中添加动态参数用于服务器段安全验证
从前一个页面(含有服务器段返回给客户端的参数,用于在下一次请求时验证)中添加后置处理器中的Regular Expression Extractor,使用正则表达式对参数进行提取. 在用到这些变量时可以 ...
- postman 模拟请求中添加 header,post请求中传json参数
1. GET 请求 2.Post 请求 (请求参数为Json,header中带有参数) 问题延伸 GET请求不能够 添加 Body 吗?[答案]
- linux curl http get 请求中带有中文参数或者特殊字符处理
在使用c++去请求http服务的时候,使用的是著名的curl工具提供的类库 libcurl,但是在使用的过程中发现,如果请求的参数值带了空格或者是参数是中文,会导致响应的回调函数没有被执行,虽然cur ...
- LoadRunner---http请求中对中文参数的处理
Loadrunner 做保险承保业务测试 1. 保险正常业务流程:保费计算--->保存--->申请核保--->核保--->缴费(出保单) 问题一描述 保费计算接口中,需要把车牌 ...
- Koa系框架(egg/cabloy)如何获取微信支付回调请求中的xml参数
背景 在Koa系框架(如EggJS)中进行微信支付开发时,遇到一个问题:微信支付平台会发送一个回调请求,通知支付订单的处理结果.该请求传入的参数是xml格式,而Koa中间件koa-bodyparser ...
随机推荐
- 6 MyBatis动态SQL之choose(when、otherwise)语句
1 MyBatis动态SQL之if 语句 2 MyBatis动态sql之where标签|转 3 MyBatis动态SQL之set标签|转 4 MyBatis动态SQL之trim元素|转 5 MyBat ...
- Spring注解之@Autowired:按类型自动装配Bean到数组、集合和Map
在Spring Boot项目中,如何把某些接口的多个实现类的Bean注入到Arrays, java.util.Collection 和 java.util.Map类型的变量中,方便应用的时候直接读取? ...
- IntelliJ IDEA 2022.3.1破解教程mac,windows,linux均适用/JetBrains产品全版本激活
前言 这个文章是2022.3.1的, 要2023.1的看我另一篇博文 https://www.cnblogs.com/daen/p/17363977.html 说明 以下使用IDEA作为演示 下载补丁 ...
- JuiceFS v1.3-Beta2:集成 Apache Ranger,实现更精细化的权限控制
在大数据场景中,文件系统和应用组件的权限管理至关重要.在最新发布的 JuiceFS 社区版 v1.3-Beta 2 中,JuiceFS 引入了与 Apache Ranger 的集成,提供了更为灵活和细 ...
- 前端将医学影像DCM转换为Base64 图像数据的方法
第一步 下载dicom-parser.js库 npm安装: npm install dicom-parser 第二步 封装dcm转换base64图像数据的方法 /** * dicomToBase64. ...
- 微信小程序消息推送
简介 微信小程序发送消息推送到用户微信上 基础流程 用户登录 :获取微信提供的openid 开发者去微信公众平台申请模板:获得模板id 授权消息推送:在小程序中调用wx.requestSubscrib ...
- 高性能、高扩展、高稳定:解读 EasyMR 大数据组件自定义可扩展能力
随着互联网技术的不断发展以及大数据时代的兴起,企业对于数据分析和洞察的需求日益增长.大多数企业都积累了大量的数据,需要从这些数据中快速灵活地提取有价值的信息,以便为用户提供更好的服务或者帮助企业做出更 ...
- ThreadLocal详解:线程私有变量的正确使用姿势
ThreadLocal详解:线程私有变量的正确使用姿势 在多线程编程中,如何让每个线程都拥有自己独立的变量副本?ThreadLocal就像给每个线程分配了一个专属保险箱,解决了线程间数据冲突的问题.本 ...
- HyperWorks二维网格划分与单元连续性
自动网格划分 HyperWorks中为零件定义几何曲面是创建零件壳单元网格的最佳方式.HyperMesh 创建二维网格最有效的方法是使用 Automesh 面板直接在零件的表面创建网格. Autome ...
- 《python神经网络读书笔记》
感想: 人工智能 是一门古老的学科,意思是人为的创造出和人类相似的智能体.在很多科幻影视作品中都有描述,甚至有的影视作品中不是使用计算机来实现人工智能.但是实际上这门学科在21世纪之前一直没什么进展. ...