如何使用curl或其他命令从文件加载HTTP请求并发起请求
实现方案
curl 实现方式
curl 没有直接读取完整原始HTTP请求报文(包含首行请求行)的单参数方案,但是可以通过简单的命令组合实现,不需要额外安装工具,适配任意GET/POST等请求方法。
假设你的请求内容存储在request.txt中,执行以下通用命令即可自动解析报文发起请求:
# 提取首行的请求方法、请求路径 read -r METHOD REQ_PATH _ < request.txt # 提取Host头里的域名 HOST=$(grep '^Host: ' request.txt | awk '{print $2}') # 跳过首行请求行,剩余内容作为请求头传入curl curl -X "$METHOD" "https://$HOST$REQ_PATH" -H <(tail -n +2 request.txt)
如果是POST等带请求体的请求,只需要在request.txt里的请求头结束后空一行,再写入请求体内容,额外加一步提取请求体传给curl的-d参数即可。
零解析替代方案
如果不想做任何报文拆分,想要把文件里存储的原始HTTP报文原封不动发出,直接用底层网络工具直连服务器发送是最省事的选择,完全不需要做格式适配,支持任意符合HTTP规范的请求:
- 普通HTTP请求直接用系统自带的
nc(netcat)即可:
# 提取Host头,默认走80端口 HOST=$(grep '^Host: ' request.txt | awk '{print $2}') nc $HOST 80 < request.txt
- HTTPS请求可以用
ncat(nmap套件附带工具)或者socat:
HOST=$(grep '^Host: ' request.txt | awk '{print $2}') # 用ncat发送HTTPS请求 ncat --ssl $HOST 443 < request.txt # 或者用socat发送HTTPS请求 socat - OPENSSL:$HOST:443 < request.txt
注意:使用原始报文直连发送时,请保证报文格式符合HTTP规范:HTTP/1.1请求必须携带正确的Host头,带请求体的请求需要填写和body长度一致的
Content-Length头,否则服务器可能无法正常解析请求。
除此之外,httpie、rawhttp等第三方HTTP命令行工具也能实现类似需求,但这类工具大多需要额外安装,对原始报文发送的适配性反而不如上述底层工具直接。
内容的提问来源于stack exchange,提问作者Akshay Sharma
相关产品推荐
相关产品推荐

