MST

星途 面试题库

面试题:Bash脚本与RESTful API的高性能集成及优化

假设要与一个支持RESTful风格的用户管理API进行交互,该API有以下几个接口:1. 获取所有用户列表:GET http://api.user.com/users ,返回大量用户数据(JSON格式);2. 创建新用户:POST http://api.user.com/users ,请求体为JSON格式的用户信息;3. 更新用户信息:PUT http://api.user.com/users/{user_id} ,请求体为JSON格式需更新的信息。编写一个Bash脚本,实现:1. 从一个CSV文件中读取用户信息(每行一个用户,格式为id,name,email ),创建并更新这些用户信息到API中;2. 在获取用户列表时,由于数据量可能很大,需要采用分页方式获取(假设API支持page和limit参数来实现分页),并高效处理这些分页数据,同时要考虑网络延迟等性能问题,进行适当的优化,例如控制并发请求数量;3. 脚本要具备良好的扩展性,以便后续增加新的API接口功能时,代码改动最小。
19.4万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
#!/bin/bash

# 全局变量
API_BASE_URL="http://api.user.com"
CONCURRENCY=5  # 并发请求数量
PAGE_SIZE=100  # 每页数据量

# 创建用户函数
create_user() {
    local user_info=$1
    local id=$(echo $user_info | cut -d',' -f1)
    local name=$(echo $user_info | cut -d',' -f2)
    local email=$(echo $user_info | cut -d',' -f3)
    local payload="{\"id\":\"$id\",\"name\":\"$name\",\"email\":\"$email\"}"

    curl -s -X POST -H "Content-Type: application/json" -d "$payload" "$API_BASE_URL/users" > /dev/null
    if [ $? -eq 0 ]; then
        echo "User $name created successfully"
    else
        echo "Failed to create user $name"
    fi
}

# 更新用户函数
update_user() {
    local user_info=$1
    local id=$(echo $user_info | cut -d',' -f1)
    local name=$(echo $user_info | cut -d',' -f2)
    local email=$(echo $user_info | cut -d',' -f3)
    local payload="{\"name\":\"$name\",\"email\":\"$email\"}"

    curl -s -X PUT -H "Content-Type: application/json" -d "$payload" "$API_BASE_URL/users/$id" > /dev/null
    if [ $? -eq 0 ]; then
        echo "User $name updated successfully"
    else
        echo "Failed to update user $name"
    fi
}

# 获取用户列表函数
get_users() {
    local page=1
    local total_pages=1
    while [ $page -le $total_pages ]; do
        local response=$(curl -s "$API_BASE_URL/users?page=$page&limit=$PAGE_SIZE")
        local current_page=$(echo $response | jq -r '.page')
        total_pages=$(echo $response | jq -r '.total_pages')

        # 处理当前页数据
        echo $response | jq -r '.users[] | [.id, .name, .email] | @csv'

        page=$((page + 1))
    done
}

# 从CSV文件读取用户信息并创建/更新用户
while IFS=, read -r id name email; do
    create_user "$id,$name,$email"
    update_user "$id,$name,$email"
done < users.csv

# 获取用户列表
get_users
  1. 脚本说明

    • 全局变量部分:定义了API的基础URL,并发请求数量CONCURRENCY和每页数据量PAGE_SIZE
    • 函数部分
      • create_user函数从CSV文件中解析出用户信息,构造JSON格式的请求体,使用curl命令发送POST请求创建用户。
      • update_user函数类似,不过发送的是PUT请求来更新用户信息。
      • get_users函数通过curl获取用户列表,根据API返回的信息进行分页处理,并使用jq工具处理JSON数据。
    • 主逻辑部分
      • 使用while IFS=, read -r id name emailusers.csv文件逐行读取用户信息,调用create_userupdate_user函数。
      • 最后调用get_users函数获取并处理用户列表。
  2. 扩展性考虑

    • 每个API接口的操作封装在独立的函数中,若需要增加新的API接口功能,可新增类似的函数,并在主逻辑中适当调用,减少对已有代码的改动。
    • 全局变量的设置方便调整API的基本配置以及性能相关参数,以适应不同的API需求。