Windows环境:使用命令行脚本批量发送http请求

因为服务器Windows版本问题,无法使用curl,所以只能使用wget。

C:\Windows\System32\wget.exe

需求背景:

传入客户端参数,请求服务端。

将请求参数保存到文本文件中,命令行读取文本文件,然后分割字符串,循环发起http请求。

参数文本文件:

参数1,参数2,参数3,... ...

命令行脚本文件:

@echo off & setlocal enabledelayedexpansion
chcp 65001 > NUL


set /p param_list=< "./参数文本文件.txt"

echo %param_list%

call :loop_block
goto :eof



:loop_block
for /f "tokens=1,* delims=," %%i in ("!param_list!") do (
	echo %%i
	set param=%%i
	
	wget --header="User-Agents: Chrome" --header="Content-Type: application/json" --post-data='{"\"key"\":"\"!param!"\"}' http://localhost:8090/execute  -q -O -
	set param_list=%%j
	goto loop_block
)
goto :eof

测试执行:

服务端controller接收不到请求,控制台有以下信息:

2025-01-17 19:04:00.586 [http-nio-8090-exec-7] WARN  o.s.w.s.m.support.DefaultHandlerExceptionResolver - Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.util.Map<java.lang.String, java.lang.String> com.controller.MyController.execute(java.lang.String)]

但是将参数改为英文字符,就可以正常接收到请求参数。

然后自定义一个Filter,看下请求到底是怎么回事,发现当参数为中文时会有以下报错:

2025-01-17 16:14:17.019 [http-nio-8090-exec-2] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.nio.charset.MalformedInputException: Input length = 1
	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
	at org.apache.tomcat.util.buf.B2CConverter.convert(B2CConverter.java:239)
	at org.apache.catalina.connector.InputBuffer.realReadChars(InputBuffer.java:403)
	at org.apache.catalina.connector.InputBuffer.checkCharBufferEof(InputBuffer.java:610)
	at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:435)
	at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:108)
	at org.apache.catalina.connector.CoyoteReader.readLine(CoyoteReader.java:163)
	at com.MyRequestWrapper.<init>(MyFilter.java:121)
	at com.MyFilter.doFilter(MyFilter.java:75)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

然后无论是客户端还是服务端,尝试各种各样网罗来的解决方法,均无效😂

wget --local-encoding=utf-8 --remote-encoding=utf-8 --header="User-Agents: Chrome" --header="Accept-Charset: UTF-8" --header="Content-Type: text/plain;charset=UTF-8"

最后实在没办法了,只好暂时使用native2ascii将参数文件转为unicode,问题可以解决

native2ascii -encoding UTF-8 旧参数文件.txt 新参数文件.txt

如果有更好的、更直接的解决方法,希望大家随时交流😉。


加个计数器:

@echo off & setlocal enabledelayedexpansion
chcp 65001 > NUL

set /a counter=0
set /p param_list=< "./参数文本文件.txt"

echo %param_list%

call :loop_block
goto :eof



:loop_block
for /f "tokens=1,* delims=," %%i in ("!param_list!") do (
	set /a counter+=1
	echo 第!counter!个参数:%%i
	set param=%%i
	
	wget --local-encoding=utf-8 --remote-encoding=utf-8 --header="User-Agents: Chrome" --header="Accept-Charset: UTF-8" --header="Content-Type: text/plain;charset=UTF-8" --post-data='{"\"key"\":"\"!param!"\"}' http://localhost:8090/execute  -q -O -
	set param_list=%%j
	goto loop_block
)
goto :eof


因为set 变量长度有限制1023(中文按3个字符),可以考虑按行读取文件,同时再加一个耗时统计,脚本改进如下:

@echo off & setlocal enabledelayedexpansion
chcp 65001 > NUL

set param1=xxx

set /a counter=0
for /f "delims=" %%a in ('echo %time%') do set "startTime=%%a"

for /f "tokens=*" %%a in (./参数文件.txt) do (
	set /a counter+=1
	echo 第!counter!个参数:%%a
	
	REM set key=%%a
	wget --local-encoding=utf-8 --remote-encoding=utf-8 --header="User-Agents: Chrome" --header="Accept-Charset: UTF-8" --header="Content-Type: text/plain;charset=UTF-8" --post-data='{"\"key"\":"\"%%a"\"}' http://localhost:8090/execute  -q -O -
)


for /f "delims=" %%a in ('echo %time%') do set "endTime=%%a"
 
 
for /f "tokens=1-4 delims=:." %%i in ("%startTime%") do (
    set /a "startHour=%%i"
    set /a "startMinute=%%j"
    set /a "startSecond=%%k"
    set /a "startMillisec=%%l"
)

for /f "tokens=1-4 delims=:." %%i in ("%endTime%") do (
    set /a "endHour=%%i"
    set /a "endMinute=%%j"
    set /a "endSecond=%%k"
    set /a "endMillisec=%%l"
)
 
set /a "startTimeSec=%startHour%*3600 + %startMinute%*60 + %startSecond%"
set /a "endTimeSec=%endHour%*3600 + %endMinute%*60 + %endSecond%"
 
set /a "diff=%endTimeSec% - %startTimeSec%"
 
:: 输出耗时结果
echo 耗时: %diff% 秒

endlocal

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Logback日志技术

Logback日志技术 日志 日志&#xff08;Logging&#xff09;是软件开发和运维中用于记录系统或应用程序运行期间发生的运行信息、状态变化、错误信息等的一种机制&#xff0c;这种记录的方式就好像我们日常生活中写日记一样。它提供了一种持久化的方式&#xff0c;使得开发者…

6. 快速掌握抽象类及接口

目录 1. 抽象类1.1 抽象类语法1.2 抽象类特性1.3 抽象类的作用 2. 接口2.1 接口语法2.2 接口的特性 3. 接口案例4. 常用接口4.1 Comparable接口---compareTo()方法4.2 clonable接口---clone方法4.2 深拷贝和浅拷贝 5. Object类5.1 equals()方法5.2 toString()方法5.3 hashCode(…

womb子宫一词解趣

英语单词 womb&#xff0c;是“子宫”的意思&#xff0c;这个单词非常有趣&#xff0c;下面我们来说说它有趣在什么地方。 首先&#xff0c;womb 这个单词&#xff0c;大体可以分成两个部分&#xff0c;即wom-和b-&#xff0c;其中wom-可对应子宫的子&#xff0c;b-可对应子宫…

Spring Cloud概述

&#xff08;一&#xff09;定义 Spring Cloud是一个基于Spring Boot实现的云应用开发工具&#xff0c;它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一套完整的解决方案…

年后找工作需要注意的事项

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…

windows远程桌面连接限定ip

1&#xff0c;Windows防火墙->高级设置->远程桌面 - 用户模式(TCP-In)->作用域->远程IP地址 2&#xff0c;启用规则

电脑换固态硬盘

参考&#xff1a; https://baijiahao.baidu.com/s?id1724377623311611247 一、根据尺寸和缺口可以分为以下几种&#xff1a; 1、M.2 NVME协议的固态 大部分笔记本是22x42MM和22x80MM nvme固态。 在京东直接搜&#xff1a; M.2 2242 M.2 2280 2、msata接口固态 3、NGFF M.…

3.无重复字符的最长字串--力扣

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…

西门子【Library of Basic Controls (LBC)基本控制库”(LBC) 提供基本控制功能】

AF架构中使用的库 文章目录 Table of contents Legal information ..............................................................................................................................2 1 Introduction ................................................…

Golang Gin系列-2:搭建Gin 框架环境

开始网络开发之旅通常是从选择合适的工具开始的。在这个全面的指南中&#xff0c;我们将引导你完成安装Go编程语言和Gin框架的过程&#xff0c;Gin框架是Go的轻量级和灵活的web框架。从设置Go工作空间到将Gin整合到项目中&#xff0c;本指南是高效而强大的web开发路线图。 安装…

Visual Studio Community 2022(VS2022)安装方法

废话不多说直接上图&#xff1a; 直接上步骤&#xff1a; 1&#xff0c;首先可以下载安装一个Visual Studio安装器&#xff0c;叫做Visual Studio installer。这个安装文件很小&#xff0c;很快就安装完成了。 2&#xff0c;打开Visual Studio installer 小软件 3&#xff0c…

《offer 来了:Java 面试核心知识点精讲 -- 原理篇》

在 Java 面试的战场上&#xff0c;只知皮毛可不行&#xff0c;面试官们越来越看重对原理的理解。今天就给大家分享一本能让你在面试中脱颖而出的 “武林秘籍”——《offer 来了&#xff1a;Java 面试核心知识点精讲 -- 原理篇》。 本书详细介绍了Java架构师在BAT和移动互联网公…

1,Linux环境变量基本定义(基于Ubuntu示例进行讲解)

linux环境变量的概念 Linux环境变量&#xff08;准确说应该是shell变量&#xff09;&#xff0c;是直接存储在操作系统中的一组键值对&#xff08;dict类型&#xff09;&#xff0c;用于配置系统和应用程序的操作行为。 【有经验的描述】&#xff1a;它们的工作原理很简单&am…

5、docker-compose和docker-harbor

安装部署docker-compose 自动编排工具&#xff0c;可以根据dockerfile自动化的部署docker容器。是yaml文件格式&#xff0c;注意缩进。 1、安装docker-compose 2、配置compose配置文件docker-compose.yml 3、运行docker-compose.yml -f&#xff1a;指定文件&#xff0c;up&…

b站视频(网页加客户端)+本地视频 生成回链

b站视频(网页加客户端)本地视频 生成回链 引言 基于上一篇博客方案 本地视频进度加入笔记根据进度快速锁定视频位置 我想着只有本地的话, 那b站上的视频, 不是每次都得下载下来吗? 如果是一套课程, 直接下载, 然后视频处理成mp3,还好, 如果只是一个视频, 每次这样处理就有点…

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…

电子应用设计方案94:智能AI门禁系统设计

智能 AI 门禁系统设计 一、引言 智能 AI 门禁系统旨在提供更高效、安全和便捷的门禁控制解决方案&#xff0c;结合人工智能技术实现精准的身份识别和智能化的访问管理。 二、系统概述 1. 系统目标 - 实现高精度的人脸识别、指纹识别、虹膜识别等多模态生物识别技术。 - 具备智…

机器学习经典无监督算法——聚类K-Means算法

目录 算法原理 算法步骤 算法API 算法导入 API参数理解 算法实现 算法原理 Kmeans 算法是一种无监督的聚类算法&#xff0c;目的是将数据集中的样本划分到 K 个不同的簇中。 聚类&#xff1a;将数据集中相似的数据点归为一组或一个簇的过程。 数据集&#xff1a;一组相…

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时&#xff0c;普通应用是无法使用的&#xff0c;需要在AndroidManifest中配置sharedUserId&#xff1a; AndroidManifest.xml中的android:sharedUserId“android.uid.system”&#xff0c;代表的意思是和系统相同的uid&a…

【机器学习实战入门】使用OpenCV和Keras的驾驶员疲劳检测系统

嗜睡驾驶者警报系统 防止司机疲劳驾驶警报系统 中级 Python 项目 - 司机疲劳检测系统 疲劳检测是一种安全技术&#xff0c;能够预防因司机在驾驶过程中入睡而造成的事故。 本中级 Python 项目的目标是建立一个疲劳检测系统&#xff0c;该系统将检测到一个人的眼睛闭合了一段时…