#!/bin/bash # ============================================ # 文件上传接口测试脚本 # ============================================ # 使用方法: ./test_upload_api.sh [host] [port] # 示例: ./test_upload_api.sh localhost 5232 # ============================================ # 配置参数 HOST=${1:-localhost} PORT=${2:-5232} BASE_URL="http://${HOST}:${PORT}" UPLOAD_URL="${BASE_URL}/api/v1/parse/upload" STATUS_URL="${BASE_URL}/parse/status" REGISTER_URL="${BASE_URL}/auth/register" # 测试文件路径(相对于脚本所在目录) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TEST_FILE="${SCRIPT_DIR}/test.docx" # 测试用户信息 TIMESTAMP=$(date +%s) TEST_USERNAME="testuser_${TIMESTAMP}" TEST_EMAIL="testuser_${TIMESTAMP}@test.com" TEST_PASSWORD="Test123456!" USER_ID="" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 输出函数 print_header() { echo -e "\n${BLUE}============================================${NC}" echo -e "${BLUE}$1${NC}" echo -e "${BLUE}============================================${NC}" } print_success() { echo -e "${GREEN}✓ $1${NC}" } print_error() { echo -e "${RED}✗ $1${NC}" } print_info() { echo -e "${YELLOW}➤ $1${NC}" } # 检查依赖 check_dependencies() { print_header "检查依赖" if ! command -v curl &> /dev/null; then print_error "curl 未安装" exit 1 fi print_success "curl 已安装" if ! command -v jq &> /dev/null; then print_info "jq 未安装,JSON格式化将不可用" JQ_AVAILABLE=false else print_success "jq 已安装" JQ_AVAILABLE=true fi } # 检查测试文件 check_test_file() { print_header "检查测试文件" if [ ! -f "$TEST_FILE" ]; then print_error "测试文件不存在: $TEST_FILE" exit 1 fi FILE_SIZE=$(stat -c%s "$TEST_FILE" 2>/dev/null || stat -f%z "$TEST_FILE" 2>/dev/null) print_success "测试文件存在: $TEST_FILE" print_info "文件大小: $FILE_SIZE bytes" } # 检查服务是否可用 check_service() { print_header "检查服务状态" print_info "测试服务: $BASE_URL" HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "${BASE_URL}/actuator/health" 2>/dev/null) if [ "$HTTP_CODE" = "200" ]; then print_success "服务正常运行 (HTTP $HTTP_CODE)" elif [ "$HTTP_CODE" = "000" ]; then print_error "无法连接到服务 $BASE_URL" print_info "请确保 parse-service 正在运行" exit 1 else print_info "健康检查返回 HTTP $HTTP_CODE,继续测试..." fi } # 注册测试用户 register_test_user() { print_header "注册测试用户" print_info "用户名: $TEST_USERNAME" print_info "邮箱: $TEST_EMAIL" print_info "注册URL: $REGISTER_URL" RESPONSE=$(curl -s -w "\n%{http_code}" \ -X POST "$REGISTER_URL" \ -H "Content-Type: application/json" \ -d "{\"username\":\"${TEST_USERNAME}\",\"email\":\"${TEST_EMAIL}\",\"password\":\"${TEST_PASSWORD}\",\"confirmPassword\":\"${TEST_PASSWORD}\"}" \ --connect-timeout 10) HTTP_CODE=$(echo "$RESPONSE" | tail -n1) BODY=$(echo "$RESPONSE" | sed '$d') echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE" if [ "$JQ_AVAILABLE" = true ]; then echo "$BODY" | jq . 2>/dev/null || echo "$BODY" else echo "$BODY" fi # 解析用户ID if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then print_success "用户注册成功!" if [ "$JQ_AVAILABLE" = true ]; then USER_ID=$(echo "$BODY" | jq -r '.data.user.id // .data.userId // .userId // empty' 2>/dev/null) if [ -z "$USER_ID" ] || [ "$USER_ID" = "null" ]; then # 尝试其他可能的字段 USER_ID=$(echo "$BODY" | jq -r '.data.id // .id // empty' 2>/dev/null) fi if [ -n "$USER_ID" ] && [ "$USER_ID" != "null" ]; then print_info "用户ID: $USER_ID" echo "$USER_ID" > "${SCRIPT_DIR}/.last_user_id" else print_error "无法从响应中获取用户ID" echo "响应内容: $BODY" exit 1 fi fi else print_error "用户注册失败 (HTTP $HTTP_CODE)" print_info "响应: $BODY" exit 1 fi } # 测试文件上传 test_upload() { print_header "测试文件上传接口" print_info "上传URL: $UPLOAD_URL" print_info "用户ID: $USER_ID" print_info "文件: $TEST_FILE" echo -e "\n发送请求..." RESPONSE=$(curl -s -w "\n%{http_code}" \ -X POST "$UPLOAD_URL" \ -H "Content-Type: multipart/form-data" \ -F "file=@${TEST_FILE}" \ -F "userId=${USER_ID}" \ --connect-timeout 10 \ --max-time 300) HTTP_CODE=$(echo "$RESPONSE" | tail -n1) BODY=$(echo "$RESPONSE" | sed '$d') echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE" echo -e "${YELLOW}响应内容:${NC}" if [ "$JQ_AVAILABLE" = true ]; then echo "$BODY" | jq . 2>/dev/null || echo "$BODY" else echo "$BODY" fi # 解析响应 if [ "$HTTP_CODE" = "200" ]; then print_success "文件上传成功!" # 提取documentId用于后续状态查询 if [ "$JQ_AVAILABLE" = true ]; then DOCUMENT_ID=$(echo "$BODY" | jq -r '.data.documentId // .documentId // empty' 2>/dev/null) if [ -n "$DOCUMENT_ID" ] && [ "$DOCUMENT_ID" != "null" ]; then print_info "文档ID: $DOCUMENT_ID" echo "$DOCUMENT_ID" > "${SCRIPT_DIR}/.last_document_id" # 查询解析状态 test_parse_status "$DOCUMENT_ID" fi fi else print_error "文件上传失败 (HTTP $HTTP_CODE)" fi } # 测试解析状态查询 test_parse_status() { local DOC_ID=$1 print_header "查询解析状态" print_info "文档ID: $DOC_ID" print_info "状态URL: ${STATUS_URL}/${DOC_ID}" # 等待一会儿让解析任务开始 sleep 2 RESPONSE=$(curl -s -w "\n%{http_code}" \ -X GET "${STATUS_URL}/${DOC_ID}" \ --connect-timeout 10) HTTP_CODE=$(echo "$RESPONSE" | tail -n1) BODY=$(echo "$RESPONSE" | sed '$d') echo -e "\n${YELLOW}响应状态码:${NC} $HTTP_CODE" echo -e "${YELLOW}响应内容:${NC}" if [ "$JQ_AVAILABLE" = true ]; then echo "$BODY" | jq . 2>/dev/null || echo "$BODY" else echo "$BODY" fi if [ "$HTTP_CODE" = "200" ]; then print_success "状态查询成功!" else print_error "状态查询失败 (HTTP $HTTP_CODE)" fi } # 轮询解析状态直到完成 poll_parse_status() { local DOC_ID=$1 local MAX_ATTEMPTS=${2:-30} local INTERVAL=${3:-5} print_header "轮询解析状态 (最多${MAX_ATTEMPTS}次, 间隔${INTERVAL}秒)" for ((i=1; i<=MAX_ATTEMPTS; i++)); do print_info "第 $i 次查询..." RESPONSE=$(curl -s "${STATUS_URL}/${DOC_ID}" --connect-timeout 10) if [ "$JQ_AVAILABLE" = true ]; then STATUS=$(echo "$RESPONSE" | jq -r '.data.parseStatus // .parseStatus // empty' 2>/dev/null) echo "当前状态: $STATUS" if [ "$STATUS" = "2" ] || [ "$STATUS" = "COMPLETED" ]; then print_success "解析完成!" echo "$RESPONSE" | jq . return 0 elif [ "$STATUS" = "3" ] || [ "$STATUS" = "FAILED" ]; then print_error "解析失败!" echo "$RESPONSE" | jq . return 1 fi else echo "$RESPONSE" fi sleep $INTERVAL done print_error "轮询超时" return 1 } # 显示使用帮助 show_help() { echo "使用方法: $0 [选项] [host] [port]" echo "" echo "选项:" echo " -h, --help 显示帮助信息" echo " -p, --poll 上传后轮询解析状态直到完成" echo " -s, --status 仅查询上次上传的文档状态" echo "" echo "示例:" echo " $0 # 使用默认配置 (localhost:5232)" echo " $0 192.168.1.100 5232 # 指定服务器地址" echo " $0 -p # 上传并轮询状态" echo " $0 -s # 查询上次上传的状态" } # 主函数 main() { local POLL_STATUS=false local STATUS_ONLY=false # 解析参数 while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -p|--poll) POLL_STATUS=true shift ;; -s|--status) STATUS_ONLY=true shift ;; *) if [[ -z "$HOST_ARG" ]]; then HOST=$1 elif [[ -z "$PORT_ARG" ]]; then PORT=$1 fi shift ;; esac done # 更新URL BASE_URL="http://${HOST}:${PORT}" UPLOAD_URL="${BASE_URL}/api/v1/parse/upload" STATUS_URL="${BASE_URL}/parse/status" REGISTER_URL="${BASE_URL}/auth/register" print_header "文件上传接口测试" echo "目标服务: $BASE_URL" echo "时间: $(date '+%Y-%m-%d %H:%M:%S')" check_dependencies if [ "$STATUS_ONLY" = true ]; then if [ -f "${SCRIPT_DIR}/.last_document_id" ]; then DOCUMENT_ID=$(cat "${SCRIPT_DIR}/.last_document_id") test_parse_status "$DOCUMENT_ID" else print_error "未找到上次上传的文档ID" exit 1 fi exit 0 fi check_test_file check_service register_test_user test_upload if [ "$POLL_STATUS" = true ] && [ -f "${SCRIPT_DIR}/.last_document_id" ]; then DOCUMENT_ID=$(cat "${SCRIPT_DIR}/.last_document_id") poll_parse_status "$DOCUMENT_ID" fi print_header "测试完成" } # 运行主函数 main "$@"