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

news2025/7/15 3:43:05

一、场景痛点与需求分析

在分布式系统架构中,服务接口的可用性和稳定性直接影响业务连续性。当面临以下场景时,需批量巡检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++)); do
    local c="${string:i:1}"
    case $c in
      [a-zA-Z0-9.~_-]) encoded+="$c" ;;
      *) encoded+=$(printf '%%%02X' "'$c") ;;
    esac
  done
  echo "$encoded"
}

# 核心请求函数
execute_request() {
  local api_name=$1
  local method=$2
  local base_url=$3
  local content_type=$4
  local template=$5
  local params=($6)

  local retry=0
  local success=0
  local final_url=""
  local payload=""
  local curl_cmd=""

  # 参数校验
  local expected_args=$(grep -o '%[^%]*' <<< "$template" | wc -l)
  if [ ${#params[@]} -ne $expected_args ]; then
    echo -e "${RED}[配置错误]${NC} ${api_name} 参数数量不匹配(预期${expected_args},实际${#params[@]})"
    return 1
  fi

  # 构建请求
  case $method in
    GET)
      # 处理GET参数编码
      encoded_params=()
      for param in "${params[@]}"; do
        encoded_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" ]]; then
        payload=$(printf "$template" "${params[@]}")
      else
        # 处理表单编码
        encoded_params=()
        for param in "${params[@]}"; do
          encoded_params+=("$(urlencode "$param")")
        done
        payload=$(printf "$template" "${encoded_params[@]}")
      fi
      final_url=$base_url
      curl_cmd="curl -X $method -d '$payload'"
      ;;
      
    DELETE)
      final_url=$base_url
      curl_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 ]; do
    local 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 ]; then
      success=1
      break
    else
      ((retry++))
      sleep $((retry * 2))  # 指数退避
    fi
  done

  # 记录日志
  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 ]; then
    printf "${GREEN}%-7s${NC} | ${CYAN}%-20s${NC} | ${BLUE}%-4s${NC} | 状态:%-6s | 耗时:%-5s\n" \
      "[$method]" "$api_name" "$http_code" "$status" "${time_total}s"
  else
    printf "${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=0
  while [ $i -lt ${#API_CONFIG[@]} ]; do
    api_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)$ ]]; do
      params_list+=("${API_CONFIG[$i]}")
      ((i++))
    done

    # 生成任务
    for params in "${params_list[@]}"; do
      echo "$api_name $method $base_url $content_type $template $params" > $TMP_PIPE
    done
  done

  # 并行执行
  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格式请使用单引号定义模板字符串
建议在测试环境验证配置后再用于生产环境
日志文件包含敏感信息,请注意保管

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端面试宝典---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;在输入数据边缘…

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

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

django之账号管理功能

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

月之暗面开源 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…

刚体运动 (位置向量 - 旋转矩阵) 笔记 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;比…

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

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

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; 目录 …

开源项目实战学习之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 经过线段…

Java 富文本转word

前言&#xff1a; 本文的目的是将传入的富文本内容(html标签&#xff0c;图片)并且分页导出为word文档。 所使用的为docx4j 一、依赖导入 <!-- 富文本转word --><dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId&…

多模态大语言模型arxiv论文略读(四十三)

InteraRec: Screenshot Based Recommendations Using Multimodal Large Language Models ➡️ 论文标题&#xff1a;InteraRec: Screenshot Based Recommendations Using Multimodal Large Language Models ➡️ 论文作者&#xff1a;Saketh Reddy Karra, Theja Tulabandhula …

GPU加速-系统CUDA12.5-Windows10

误区注意 查看当前系统可支持的最高版本cuda&#xff1a;nvidia-smi 说明&#xff1a; 此处显示的12.7只是驱动对应的最高版本&#xff0c;不一定是 / 也不一定需要是 当前Python使用的版本。但我们所安装的CUDA版本需要 小于等于它&#xff08;即≤12.7&#xff09;因此即使…

kafka课后总结

Kafka是由LinkedIn开发的分布式发布 - 订阅消息系统&#xff0c;具备高吞吐量、低延迟、可扩展性、持久性、可靠性、容错性和高并发等特性。其主要角色包括Broker、Topic、Partition、Producer、Consumer、Consumer Group、replica、leader、follower和controller。消息系统中存…

【股票系统】使用docker本地构建ai-hedge-fund项目,模拟大师炒股进行分析。人工智能的对冲基金的开源项目

股票系统: https://github.com/virattt/ai-hedge-fund 镜像地址: https://gitcode.com/gh_mirrors/ai/ai-hedge-fund 项目地址: https://gitee.com/pythonstock/docker-run-ai-hedge-fund 这是一个基于人工智能的对冲基金的原理验证项目。本项目旨在探讨利用人工智能进行…

施工安全巡检二维码制作

进入新时代以来&#xff0c;人们对安全的重视程度越来越高。特别在建筑施工行业&#xff0c;安全不仅是关乎着工人的性命&#xff0c;更是承载着工人背后家庭的幸福生活。此时就诞生了安全巡检的工作&#xff0c;而巡检过程中内容庞杂&#xff0c;安全生产检查、隐患排查、施工…