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 ...
随机推荐
- vue3 基础-常用模板语法
一个 vue 的单文件 SAP ( single page web application ) 即在一个 .vue 为后缀的文件中, 会包含3个部分. 模板: html 逻辑: javascript ...
- 将查询集SQL-存为物理 OR 临时表
最近的BI项目, 就是会涉及大量的 sql, 后台处理也全是 sql 来拼接成一张物理宽表, 然后前台也是用 sql 来做各种图形骚操作. 尤其是后台处理部分, 大量的sql, 有点尴尬的事情是, s ...
- Web前端入门第 49 问:CSS offset 路径动画演示
什么是路径动画? 随手画一条不规则的线,让元素按照这条不规则的线运动起来,这就是所谓的路径动画. 前面说过的动画都只能针对某一个 CSS 属性,要想实现路径动画可没办法,路径动画必须借助 CSS3 的 ...
- C#窗体磁吸屏幕的两种实现方案 - 开源研究系列文章
以前在大学的时候模仿Winamp的磁吸效果编写过一个类库,用于在应用中多个窗体的相互磁吸效果.因为此效果应用不多,但是窗体磁吸屏幕边缘的效果倒是比较实用,于是就用C#来实现窗体磁吸屏幕边缘的代码,这里 ...
- 晴神宝典之C /C++快速入门
OJ 补充:runtime error通常原因是数组越界,除零,异常调用,堆栈溢出 尽可能远离TLE 选择c++ 输入输出使用printf和scanf basis 变量名取名: (1)不能是c语言标识 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(4)
1.问题描述: LoginWithHuaweiIDButton不支持深色模式下定制文字和loading样式? 解决方案: LoginWithHuaweiIDButtonParams 中的有个suppo ...
- .NET 9中的异常处理性能提升分析:为什么过去慢,未来快
一.为什么要关注.NET异常处理的性能 随着现代云原生.高并发.分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径.在高复杂度的微服务.网络服务.异步 ...
- Golang操作Json
基本的序列化 首先我们来看看Go语言中json.Marshal()(序列化)与json.Unmarshal(反序列化)的基本用法. package main import ( "encodi ...
- 2025私域运营工具攻略:9款AI+SCRM神器助你留存爆发
私域流量的战火在2025年依旧熊熊燃烧.相比于烧钱获取公域流量,精细化运营私域用户成为越来越多企业的共识.但真正做得好的运营者都明白,留存和转化不是靠刷屏,而是靠体系和工具支撑. 这篇文章,我们将围绕 ...
- 再不用手写Commit!AI自动总结代码变更,Git提交效率
背景 今天写完代码后, commit到git仓库, 让我写提交信息时, 突然发现了些问题 1.发现git commit 经常很难描述清晰 在写后面的message, 如: git commit -m ...