当前位置: 首页 > article >正文

分享一个可以批量巡检GET和POST接口的Shell脚本

一、场景痛点与需求分析

在分布式系统架构中,服务接口的可用性和稳定性直接影响业务连续性。当面临以下场景时,需批量巡检GET和POST接口:

上线验证:新版本发布后批量验证核心接口

故障恢复:异常数据修复后的批量重试机制

日常巡检:定时检查关键业务接口健康状态

压力测试:模拟批量请求进行性能基线测试

传统人工操作存在效率低下(500+请求需2小时)、漏检率高(人工疲劳导致)、结果不可追溯等问题。

二、脚本

#!/bin/bash
# 多方法接口巡检脚本
# 用法:./multi_method_check.sh [并发数] [重试次数] [超时时间]# 配置区 ==============================================================
declare -a API_CONFIG=(# 格式说明:# "接口描述" # "HTTP方法" # "请求URL/路径" # "Content-Type" # "参数模板(printf格式)" # "参数组1" # "参数组2"# GET示例:用户查询"用户查询接口" "GET" "http://api.example.com/users" "" "id=%s&name=%s" "123 alice" "456 bob"# POST示例:创建订单(JSON格式)"订单创建接口" "POST" "http://api.example.com/orders" "application/json" '{"order_id":"%s","amount":%.2f}' "ORD001 100.50" "ORD002 200.00"# POST示例:表单提交"用户注册接口" "POST" "http://api.example.com/register" "application/x-www-form-urlencoded" "username=%s&age=%d" "charlie 25" "david 30"
)# 全局设置
DEFAULT_CONCURRENCY=5    # 默认并发数
DEFAULT_RETRY=3          # 默认重试次数
DEFAULT_TIMEOUT=10       # 默认超时(秒)
# ===================================================================# 初始化执行参数
CONCURRENCY=${1:-$DEFAULT_CONCURRENCY}
MAX_RETRY=${2:-$DEFAULT_RETRY}
TIMEOUT=${3:-$DEFAULT_TIMEOUT}
LOG_FILE="api_check_$(date +%Y%m%d%H%M%S).csv"
TMP_PIPE=$(mktemp -u)
mkfifo $TMP_PIPE# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'# 创建日志文件头
echo "timestamp,api_name,method,status,http_code,time_total,url,payload,response" > $LOG_FILE# URL编码函数
urlencode() {local string="${1}"local length="${#string}"local encoded=""for ((i = 0; i < length; i++)); dolocal c="${string:i:1}"case $c in[a-zA-Z0-9.~_-]) encoded+="$c" ;;*) encoded+=$(printf '%%%02X' "'$c") ;;esacdoneecho "$encoded"
}# 核心请求函数
execute_request() {local api_name=$1local method=$2local base_url=$3local content_type=$4local template=$5local params=($6)local retry=0local success=0local final_url=""local payload=""local curl_cmd=""# 参数校验local expected_args=$(grep -o '%[^%]*' <<< "$template" | wc -l)if [ ${#params[@]} -ne $expected_args ]; thenecho -e "${RED}[配置错误]${NC} ${api_name} 参数数量不匹配(预期${expected_args},实际${#params[@]})"return 1fi# 构建请求case $method inGET)# 处理GET参数编码encoded_params=()for param in "${params[@]}"; doencoded_params+=("$(urlencode "$param")")done# 格式化查询字符串query_string=$(printf "$template" "${encoded_params[@]}")final_url="${base_url}?${query_string}"curl_cmd="curl -G -sS";;POST|PUT|PATCH)# 处理POST参数if [[ "$content_type" == "application/json" ]]; thenpayload=$(printf "$template" "${params[@]}")else# 处理表单编码encoded_params=()for param in "${params[@]}"; doencoded_params+=("$(urlencode "$param")")donepayload=$(printf "$template" "${encoded_params[@]}")fifinal_url=$base_urlcurl_cmd="curl -X $method -d '$payload'";;DELETE)final_url=$base_urlcurl_cmd="curl -X DELETE";;*)echo -e "${RED}[错误]${NC} 不支持的HTTP方法: $method"return 1;;esac# 添加公共curl参数curl_cmd+=" --max-time $TIMEOUT"curl_cmd+=" -w '\nHTTP_CODE:%{http_code} TIME:%{time_total}'"[[ -n "$content_type" ]] && curl_cmd+=" -H 'Content-Type: $content_type'"curl_cmd+=" $final_url"# 执行请求while [ $retry -lt $MAX_RETRY ]; dolocal start_time=$(date +%s%3N)# 执行并捕获响应local response=$(eval "$curl_cmd" 2>&1)local exit_code=$?local end_time=$(date +%s%3N)# 解析响应local http_code=$(echo "$response" | awk -F 'HTTP_CODE:' '{print $2}' | cut -d' ' -f1)local time_total=$(echo "$response" | awk -F 'TIME:' '{print $2}')local response_body=$(echo "$response" | sed '/HTTP_CODE:/d')# 判断成功条件if [ $exit_code -eq 0 ] && [ "$http_code" -eq 200 ]; thensuccess=1breakelse((retry++))sleep $((retry * 2))  # 指数退避fidone# 记录日志local timestamp=$(date +"%Y-%m-%d %T")local status=$([ $success -eq 1 ] && echo "SUCCESS" || echo "FAILURE")local log_entry="$timestamp,\"$api_name\",$method,$status,$http_code,${time_total}s,\"$final_url\",\"${payload//\"/'\"'}\",\"${response_body//\"/'\"'}\""echo "$log_entry" >> $LOG_FILE# 控制台输出if [ $success -eq 1 ]; thenprintf "${GREEN}%-7s${NC} | ${CYAN}%-20s${NC} | ${BLUE}%-4s${NC} | 状态:%-6s | 耗时:%-5s\n" \"[$method]" "$api_name" "$http_code" "$status" "${time_total}s"elseprintf "${RED}%-7s${NC} | ${CYAN}%-20s${NC} | ${BLUE}%-4s${NC} | 尝试:%-2d | 错误:%-6s\n" \"[$method]" "$api_name" "$http_code" $retry "${exit_code}"fi
}# 主执行逻辑
main() {echo -e "${YELLOW}=== 开始接口巡检 ==="echo -e "并发数: $CONCURRENCY | 最大重试: $MAX_RETRY | 超时: ${TIMEOUT}s"echo -e "===================================${NC}"# 解析配置local i=0while [ $i -lt ${#API_CONFIG[@]} ]; doapi_name=${API_CONFIG[$i]}((i++))method=${API_CONFIG[$i]}((i++))base_url=${API_CONFIG[$i]}((i++))content_type=${API_CONFIG[$i]}((i++))template=${API_CONFIG[$i]}((i++))# 收集参数组params_list=()while [ $i -lt ${#API_CONFIG[@]} ] && [[ ! ${API_CONFIG[$i]} =~ ^(GET|POST|PUT|PATCH|DELETE)$ ]]; doparams_list+=("${API_CONFIG[$i]}")((i++))done# 生成任务for params in "${params_list[@]}"; doecho "$api_name $method $base_url $content_type $template $params" > $TMP_PIPEdonedone# 并行执行cat $TMP_PIPE | xargs -P $CONCURRENCY -n 1 -I {} bash -c 'execute_request {}'# 清理临时文件rm -f $TMP_PIPE# 结果统计local total=$(grep -c "SUCCESS" $LOG_FILE)local success=$(grep -c "SUCCESS" $LOG_FILE)local failure=$((total - success))echo -e "\n${YELLOW}========== 最终结果 =========="echo -e "总请求数: $total"echo -e "${GREEN}成功: $success${NC}"echo -e "${RED}失败: $failure${NC}"echo -e "日志文件: $LOG_FILE${NC}"
}# 执行主函数
main

三、使用说明

修改配置区:在API_CONFIG数组中按以下格式配置接口:

"接口描述"          # 接口名称(任意字符串)
"HTTP方法"         # GET/POST/PUT/PATCH/DELETE
"请求URL"          # 接口地址(包含协议和域名)
"Content-Type"     # 请求内容类型(GET可留空)
"参数模板"         # printf格式字符串,用于生成参数
"参数组1"          # 空格分隔的参数值(按模板顺序)
"参数组2"          # 更多参数组...

执行脚本:

chmod +x multi_method_check.sh
./multi_method_check.sh 10 3 15  # 并发数10 重试3次 超时15秒

配置示例说明:

#GET请求示例(带查询参数)
"用户查询接口" 
"GET" 
"http://api.example.com/users" 
""  # 内容类型留空
"id=%s&name=%s" # 参数模板
"123 alice"     # 参数组1:id=123&name=alice
"456 bob"       # 参数组2:id=456&name=bob#POST JSON示例
"订单创建接口" 
"POST" 
"http://api.example.com/orders" 
"application/json" 
'{"order_id":"%s","amount":%.2f}' 
"ORD001 100.50"  # 生成JSON:{"order_id":"ORD001","amount":100.50}
"ORD002 200.00" #POST表单示例
"用户注册接口" 
"POST" 
"http://api.example.com/register" 
"application/x-www-form-urlencoded" 
"username=%s&age=%d" 
"charlie 25"  # 生成:username=charlie&age=25
"david 30"

注意事项

参数模板中的占位符数量必须与参数组的参数数量严格一致
特殊字符会自动进行URL编码处理
JSON格式请使用单引号定义模板字符串
建议在测试环境验证配置后再用于生产环境
日志文件包含敏感信息,请注意保管

相关文章:

分享一个可以批量巡检GET和POST接口的Shell脚本

一、场景痛点与需求分析 在分布式系统架构中&#xff0c;服务接口的可用性和稳定性直接影响业务连续性。当面临以下场景时&#xff0c;需批量巡检GET和POST接口&#xff1a; 上线验证&#xff1a;新版本发布后批量验证核心接口 故障恢复&#xff1a;异常数据修复后的批量重试…...

前端面试宝典---vue原理

vue的Observer简化版 class Observer {constructor(value) {if (!value || typeof value ! object) returnthis.walk(value) // 对对象的所有属性进行遍历并定义响应式}walk (obj) {Object.keys(obj).forEach(key > defineReactive(obj, key, obj[key]))} } // 定义核心方法…...

PyTorch卷积层填充(Padding)与步幅(Stride)详解及代码示例

本文通过具体代码示例讲解PyTorch中卷积操作的填充&#xff08;Padding&#xff09;和步幅&#xff08;Stride&#xff09;对输出形状的影响&#xff0c;帮助读者掌握卷积层的参数配置技巧。 一、填充与步幅基础 填充&#xff08;Padding&#xff09;&#xff1a;在输入数据边缘…...

2025年Redis分片存储性能优化指南

一、分片规则与负载均衡 动态哈希分片‌ 采用CRC16算法计算键哈希值&#xff0c;通过hash_slot CRC16(key) % 16384确定槽位分布&#xff0c;结合Redis Cluster自动管理槽位迁移。 总分片数按需动态调整&#xff0c;例如从16节点扩容至32节点时&#xff0c;触发槽位重分配以…...

【概念】什么是 JWT Token?

—什么是 JWT Token&#xff1f; JWT Token&#xff08;JSON Web Token&#xff09; 就是一张后端发给前端的小票&#xff0c;里面包含用户身份信息&#xff0c;用于做无状态认证&#xff08;Stateless Authentication&#xff09;。 每次前端访问后端接口&#xff0c;都拿着…...

部署大模型需要多少GPU显存?以DeepSeek R1部署为例

引言 部署大型语言模型&#xff08;LLM&#xff09;时究竟需要多少GPU显存&#xff1f;本文将进行一次简单测算。 如何计算 算法1 可以用一个简单的公式来计算显存占用&#xff08;单位GB&#xff09;&#xff1a; 参数说明如下&#xff1a; 符号 含义 M 所需的 GPU 显存…...

用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1

希望借助手写这个go的中间件项目&#xff0c;能够理解go语言的特性以及用go写中间件的优势之处&#xff0c;同时也是为了更好的使用和优化公司用到的trpc&#xff0c;并且作者之前也使用过grpc并有一定的兴趣&#xff0c;所以打算从0构建一个rpc系统&#xff0c;对于生产环境已…...

Fedora 43 计划移除所有 GNOME X11 相关软件包

Fedora 43 计划移除所有 GNOME X11 相关软件包&#xff0c;这是 Fedora 项目团队为全面拥抱 Wayland 所做的重要决策。以下是关于此计划的详细介绍&#xff1a; 提案内容&#xff1a;4 月 23 日&#xff0c;Neal Gompa 提交提案&#xff0c;建议从 Fedora 软件仓库中移除所有 G…...

django之账号管理功能

账号管理功能 目录 1.账号管理页面 2.新增账号 3.修改账号 4.账号重置密码 5.删除账号功能 6.所有代码展示集合 7.运行结果 这一片文章, 我们需要新增账号管理功能, 今天我们写到的代码, 基本上都是用到以前所过的知识, 不过也有需要注意的细节。 一、账号管理界面 …...

搭建spark-local模式

要搭建Spark的local模式&#xff0c;你可以按照以下步骤进行操作&#xff08;以在Linux系统上安装为例&#xff0c;假设你已经安装了Java环境&#xff09;&#xff1a; 1. 下载Spark安装包&#xff1a;访问Spark官方网站&#xff08;https://spark.apache.org/downloads.html&a…...

月之暗面开源 Kimi-Audio-7B-Instruct,同时支持语音识别和语音生成

我们向您介绍在音频理解、生成和对话方面表现出色的开源音频基础模型–Kimi-Audio。该资源库托管了 Kimi-Audio-7B-Instruct 的模型检查点。 Kimi-Audio 被设计为通用的音频基础模型&#xff0c;能够在单一的统一框架内处理各种音频处理任务。主要功能包括&#xff1a; 通用功…...

IDEA配置将Servlet真正布署到Tomcat

刚开始只能IDEA运行完Servlet web application 并保持IDEA运行才能通过浏览器访问到我的Servlet&#xff0c;跟想象中的不一样&#xff0c;不应该是IDEA运行完项目以后只要打开Tomcat就能访问吗&#xff1f;事实时运行完项目只要关掉IDEA就不能再访问到应用了&#xff0c;而且T…...

删除新安装IBM Guardium Data Protection 12.1的baltimorecybertrustroot证书

登录web console&#xff0c;会显示 baltimorecybertrustroot证书过期警告。 采用下面的命令删除过期证书就可消除警告。 collector02.cpd.com> delete certificate keystore Select an alias from the list below to delete the corresponding certificate. Alias List:…...

【蓝桥杯】画展布置

画展布置 题目描述 画展策展人小蓝和助理小桥为即将举办的画展准备了 N N N 幅画作&#xff0c;其艺术价值分别为 A 1 , A 2 , … , A N A_1, A_2, \dots , A_N A1​,A2​,…,AN​。他们需要从这 N N N 幅画中挑选 M M M 幅&#xff0c;并按照一定顺序布置在展厅的 M M …...

请求参数、路径参数、查询参数、Spring MVC/FeignClient请求相关注解梳理

目录 1 请求分类1.1 URL参数--查询参数1.2 URL参数--路径参数 2 请求相关注解2.1 RequestParam--查询参数2.2 PathVariable--路径参数2.3 RequestBody2.4 Param & RequestLine2.5 SpringMVC请求参数注解用在FeignClient里 使用SpringMVC处理http请求或使用FeignClient进行请…...

MySQL 详解之复制与集群:构建高可用与可扩展数据库架构

随着业务的发展,单一的数据库实例往往难以满足需求: 性能瓶颈: 读写请求量不断增加,单个服务器的 CPU、内存、磁盘、网络资源达到上限,尤其是读请求远大于写请求的场景。高可用性: 单个服务器一旦发生故障(硬件故障、操作系统问题、机房断电等),数据库服务将完全中断,…...

刚体运动 (位置向量 - 旋转矩阵) 笔记 1.1~1.3 (台大机器人学-林沛群)

目录 1. 理解刚体的“自由度”&#xff08;Degrees of Freedom, DOF&#xff09; 1.1 平面运动 (2D) 1.2 空间运动 (3D) 2. 统一描述&#xff1a;引入“体坐标系”&#xff08;Body Frame&#xff09; 3. 从“状态”到“运动”&#xff1a;引入微分 3.1 补充&#xff1a;…...

openAICEO山姆奥特曼未来预测雄文之三个观察

《三个观察》 山姆奥特曼 这篇文章主要讲的是关于AGI&#xff08;人工通用智能&#xff09;的未来发展及其对社会的影响&#xff0c;用大白话总结如下&#xff1a; 核心观点&#xff1a; AGI是什么&#xff1f; AGI是一种能像人类一样解决各种复杂问题的智能系统&#xff0c;比…...

Java 异常 SSLException: fatal alert: protocol_version 全解析与解决方案

在 Java 网络通信中&#xff0c;SSLException: fatal alert: protocol_version 是典型的 TLS/SSL 协议版本不兼容异常。本文结合 Java 官方规范、TLS 协议标准及实战经验&#xff0c;提供体系化解决方案&#xff0c;帮助开发者快速定位并解决协议版本冲突问题。 一、异常本质&…...

比象AI创作系统,多模态大模型:问答分析+AI绘画+管理后台系统

比象AI创作系统是新一代集智能问答、内容创作与商业运营于一体的综合型AI平台。本系统深度融合GPT-4.0/GPT-4o多模态大模型技术&#xff0c;结合实时联网搜索与智能分析能力&#xff0c;打造了从内容生产到商业变现的完整闭环解决方案。 智能问答中枢 系统搭载行业领先的对话…...

【2025 最新前沿 MCP 教程 03】基础构建模块:工具、资源与提示

文章目录 1. 开始啦2. 工具&#xff08;模型控制&#xff09;&#xff1a;赋予 AI 行动能力3. 资源&#xff08;应用控制&#xff09;&#xff1a;为 AI 提供关键上下文4. 提示&#xff08;用户可控&#xff09;&#xff1a;优化 AI 交互5. 它们如何协同工作 1. 开始啦 欢迎来…...

Docker-高级使用

前言 书接上文Docker-初级安装及使用_用docker安装doccano-CSDN博客&#xff0c;我们讲解了Docker的基本操作&#xff0c;下面我们讲解的是高级使用&#xff0c;请大家做好准备&#xff01; 大家如果是从初级安装使用过来的话&#xff0c;建议把之前镜像和搭载的容器数据卷里面…...

计算机网络 | Chapter1 计算机网络和因特网

&#x1f493;个人主页&#xff1a;mooridy-CSDN博客 &#x1f493;文章专栏&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f339;关注我&#xff0c;和我一起学习更多计算机网络的知识 &#x1f51d;&#x1f51d; 目录 …...

PowerBi中ALLEXCEPT怎么使用?

在 Power BI 的 DAX 中&#xff0c;ALLEXCEPT() 是一个非常重要的函数&#xff0c;用来实现**“在保留部分筛选条件的前提下&#xff0c;移除其他所有筛选器”**&#xff0c;它常用于 同比、占比、累计汇总 等分析中。 ✅ 一、ALLEXCEPT 是什么意思&#xff1f; 函数全称&…...

开源项目实战学习之YOLO11:ultralytics-cfg-datasets-Objects365、open-images-v7.yaml文件(六)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 medical - pills.yaml 通常用于配置与医学药丸检测任务相关的参数和信息 Objects365.yaml 用于配置与 Objects365 数据集相关信息的文件。Objects365 数据集包含 365 个不同的物体类别…...

蚂蚁集团“Plan A”重磅登场,开启AI未来

近期&#xff0c;蚂蚁集团面向全球高潜AI人才&#xff0c;正式发布顶级专项招募计划——“Plan A”。作为其“蚂蚁星”校招体系的全新升级模块&#xff0c;Plan A聚焦人工智能领域科研精英&#xff0c;旨在与全球高校AI研究者协同突破AGI前沿&#xff0c;共绘技术未来图谱。 蚂…...

高中数学联赛模拟试题精选第18套几何题

在 △ A B C \triangle ABC △ABC 中, A B < A C AB< AC AB<AC, 点 K K K, L L L, M M M 分别是边 B C BC BC, C A C A CA, A B AB AB 的中点. △ A B C \triangle ABC △ABC 的内切圆圆心为 I I I, 且与边 B C BC BC 相切于点 D D D. 直线 l l l 经过线段…...

Kettle学习

一、Kettle 简介 Kettle(现称为 Pentaho Data Integration)是一款开源ETL工具,支持从多种数据源抽取、转换和加载数据,广泛应用于数据仓库构建、数据迁移和清洗。其核心优势包括: 可视化操作:通过拖拽组件设计数据处理流程(转换和作业)。多数据源支持:数据库(MySQL/…...

Synopsys 逻辑综合的整体架构概览

目录 一、DC Shell 逻辑综合的整体架构概览 ⛓️ 逻辑综合的主要阶段&#xff08;Pipeline&#xff09; 二、核心架构模块详解 1. Internal Database&#xff08;设计对象数据库&#xff09; 2. Scheduler&#xff08;调度器&#xff09; 3. Rewriting Engine&#xff08…...

Missashe考研日记-day27

Missashe考研日记-day27 0 写在前面 博主昨晚有事所以没学专业课&#xff0c;白天学了其他科&#xff0c;但是觉得不太好写博客&#xff0c;就合在今天一起写好了。 1 专业课408 学习时间&#xff1a;3h30min学习内容&#xff1a; 今天把内存管理部分剩下的关于分页分段和段…...