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请求中所有的参数去除空格的更多相关文章

  1. 自动匹配HTTP请求中对应实体参数名的数据(性能不是最优)

    /// <summary> /// 获取请求参数字段 /// </summary> /// <typeparam name="T"></t ...

  2. springboot的restful风格获取请求中携带的参数

    http://localhost:8080/emp/1 有以上请求,我们controller要怎么获取请求中传递的参数1呢? 通过PathVariable注解,如下: @DeleteMapping(& ...

  3. 【原创】http请求中加号被替换为空格?源码背后的秘密

    这是why技术的第**20**篇原创文章![在这里插入图片描述](https://user-gold-cdn.xitu.io/2019/12/30/16f550eb82e10eff?w=900& ...

  4. js中对字符串(String)去除空格

    str为要去除空格的字符串: 去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/ ...

  5. Jquery中Ajax异步请求中的async参数的作用

    之前不知道这个参数的作用,上网找了前辈的博客,在此收录到自己的博客,希望能帮到更多的朋友: test.html <a href="javascript:void(0)" on ...

  6. JMeter怎么在get URL请求、POST请求中添加动态参数用于服务器段安全验证

    从前一个页面(含有服务器段返回给客户端的参数,用于在下一次请求时验证)中添加后置处理器中的Regular Expression Extractor,使用正则表达式对参数进行提取. 在用到这些变量时可以 ...

  7. postman 模拟请求中添加 header,post请求中传json参数

    1. GET 请求 2.Post 请求 (请求参数为Json,header中带有参数) 问题延伸 GET请求不能够 添加 Body 吗?[答案]

  8. linux curl http get 请求中带有中文参数或者特殊字符处理

    在使用c++去请求http服务的时候,使用的是著名的curl工具提供的类库 libcurl,但是在使用的过程中发现,如果请求的参数值带了空格或者是参数是中文,会导致响应的回调函数没有被执行,虽然cur ...

  9. LoadRunner---http请求中对中文参数的处理

    Loadrunner 做保险承保业务测试 1. 保险正常业务流程:保费计算--->保存--->申请核保--->核保--->缴费(出保单) 问题一描述 保费计算接口中,需要把车牌 ...

  10. Koa系框架(egg/cabloy)如何获取微信支付回调请求中的xml参数

    背景 在Koa系框架(如EggJS)中进行微信支付开发时,遇到一个问题:微信支付平台会发送一个回调请求,通知支付订单的处理结果.该请求传入的参数是xml格式,而Koa中间件koa-bodyparser ...

随机推荐

  1. vue3 基础-常用模板语法

    一个 vue 的单文件 SAP ( single page web application ) 即在一个 .vue 为后缀的文件中, 会包含3个部分. 模板: html 逻辑: javascript ...

  2. 将查询集SQL-存为物理 OR 临时表

    最近的BI项目, 就是会涉及大量的 sql, 后台处理也全是 sql 来拼接成一张物理宽表, 然后前台也是用 sql 来做各种图形骚操作. 尤其是后台处理部分, 大量的sql, 有点尴尬的事情是, s ...

  3. Web前端入门第 49 问:CSS offset 路径动画演示

    什么是路径动画? 随手画一条不规则的线,让元素按照这条不规则的线运动起来,这就是所谓的路径动画. 前面说过的动画都只能针对某一个 CSS 属性,要想实现路径动画可没办法,路径动画必须借助 CSS3 的 ...

  4. C#窗体磁吸屏幕的两种实现方案 - 开源研究系列文章

    以前在大学的时候模仿Winamp的磁吸效果编写过一个类库,用于在应用中多个窗体的相互磁吸效果.因为此效果应用不多,但是窗体磁吸屏幕边缘的效果倒是比较实用,于是就用C#来实现窗体磁吸屏幕边缘的代码,这里 ...

  5. 晴神宝典之C /C++快速入门

    OJ 补充:runtime error通常原因是数组越界,除零,异常调用,堆栈溢出 尽可能远离TLE 选择c++ 输入输出使用printf和scanf basis 变量名取名: (1)不能是c语言标识 ...

  6. 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(4)

    1.问题描述: LoginWithHuaweiIDButton不支持深色模式下定制文字和loading样式? 解决方案: LoginWithHuaweiIDButtonParams 中的有个suppo ...

  7. .NET 9中的异常处理性能提升分析:为什么过去慢,未来快

    一.为什么要关注.NET异常处理的性能 随着现代云原生.高并发.分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径.在高复杂度的微服务.网络服务.异步 ...

  8. Golang操作Json

    基本的序列化 首先我们来看看Go语言中json.Marshal()(序列化)与json.Unmarshal(反序列化)的基本用法. package main import ( "encodi ...

  9. 2025私域运营工具攻略:9款AI+SCRM神器助你留存爆发

    私域流量的战火在2025年依旧熊熊燃烧.相比于烧钱获取公域流量,精细化运营私域用户成为越来越多企业的共识.但真正做得好的运营者都明白,留存和转化不是靠刷屏,而是靠体系和工具支撑. 这篇文章,我们将围绕 ...

  10. 再不用手写Commit!AI自动总结代码变更,Git提交效率

    背景 今天写完代码后, commit到git仓库, 让我写提交信息时, 突然发现了些问题 1.发现git commit 经常很难描述清晰 在写后面的message,  如: git commit -m ...