- 开发工具
- 接口测试
【免费下载链接】http-prompt
An interactive command-line HTTP and API testing client built on top of HTTPie featuring autocomplete, syntax highlighting, and more. https://twitter.com/httpie
HTTP Prompt 是一个构建在 HTTPie 之上的交互式命令行 HTTP/API 测试客户端,它把 HTTPie 的简洁参数语法搬进了一个带自动补全、语法高亮和会话持久化的交互式 Shell 中。本文基于官方用户指南(docs/user-guide.rst)并结合仓库源码展开,读完你可以掌握从安装启动、四类请求参数语法、HTTPie 选项注入、命令预览,到会话保存/加载、输出重定向、管道与 Shell 替换,以及基于 OpenAPI/Swagger 规范的端点导航与自动补全这一整套实战能力。
项目定位
HTTP Prompt 由 HTTPie 与 prompt_toolkit 驱动:HTTPie 负责真正的 HTTP 请求发送与输出格式化,prompt_toolkit 负责交互式提示符、补全、历史记录与高亮。进入会话后,你的每一次输入都会被解析为对"当前上下文(Context)"的修改或一次真实的 HTTP 请求,最终由 HTTPie 的main()函数执行(见 http_prompt/cli.py 与 http_prompt/execution.py 中的_call_httpie_main)。
安装与升级
像安装普通 Python 包一样安装:
$ pip install http-prompt如果目标环境是系统级 Python 且遇到权限错误,官方推荐两条路径:
# 方式一:使用 sudo 装到系统目录(不推荐) $ sudo pip install http-prompt # 方式二:仅装入当前用户目录(推荐) $ pip install --user http-prompt升级到最新版本:
$ pip install -U http-prompt在 macOS 上也可以使用 Homebrew:
$ brew install http-prompt仓库中提供了 setup.py、setup.cfg 与 requirements.txt,安装时核心依赖为httpie、prompt_toolkit、parsimonious、pygments与click等。首次运行会执行配置初始化逻辑,这在下面的"配置"一节有详细说明。
快速上手:启动会话与基础命令
启动会话的三种方式
# 不带参数:恢复上次会话;若从未运行过,默认目标为 http://localhost:8000 $ http-prompt # 带 URL 启动 $ http-prompt http://httpbin.org # 带初始选项与请求参数启动 $ http-prompt localhost:8000/api --auth user:pass username=somebody几个值得注意的细节(有源码可查):
- URL 无需完整输入。在 http_prompt/cli.py#L33-L40 的
fix_incomplete_url()中,localhost:8000/api这类缺少协议的地址会被自动补全为http://localhost:8000/api;s://、//开头也会被规范化。 - 当不传任何参数(
sys.argv长度仅为 1)启动时,CLI 会尝试从用户数据目录加载上次保存的会话上下文(见 http_prompt/cli.py#L139-L141),这正是"恢复上次会话"的实现。 - 命令行传入的
http_options(如--auth user:pass username=somebody)会被execute()逐条执行、合并进当前上下文,且可以覆盖--env会话文件中已有的同名值(见 http_prompt/cli.py#L149-L152)。
用 cd 切换 URL
# 相对路径:在当前 URL 基础上拼接 > cd api/v1 # 绝对 URL:整体替换 > cd http://localhost/apicd的实现位于 http_prompt/execution.py#L239-L249:相对路径通过urljoin2()与当前 URL 拼接,绝对 URL 则直接替换。urljoin2还做了去尾斜杠的细节处理(http_prompt/execution.py#L147-L153),避免拼接出多余的/。
四类请求参数的语法
HTTP Prompt 沿用了 HTTPie 的参数语法,通过四种不同的赋值符号区分参数类型:
# Header(冒号) > Content-Type:application/json # Querystring 参数(双等号) > page==2 # Body 参数(单等号) > username=foo > full_name='foo bar' # Body 参数以原生 JSON 形式提交(v0.9.0 起,冒号+等号) > number:=1234 > is_ok:=true > names:=["foo","bar"] > user:='{"username": "foo", "password": "bar"}' # 同一行内混写 > Content-Type:application/json page==2 username=foo从源码看,这四种运算符正是命令文法中的mutop(:=/:/==/=),见 http_prompt/execution.py#L68 与 http_prompt/execution.py#L373-L388 的_mutate()实现,其映射关系为:
| 运算符 | 归属数据结构 | 说明 |
|---|---|---|
key:value | headers | 请求头 |
key==value | querystring_params | 查询字符串参数,同名可重复(内部用列表存储,支持a==1 a==2,见代码注释 #20) |
key=value | body_params | 表单/请求体参数 |
key:=value | body_json_params | 原生 JSON 请求体参数,值会经json.loads()解析后按 JSON 类型提交 |
带空格的值需加引号(如full_name='foo bar'),_mutate之前的文法层(http_prompt/execution.py#L34-L118 的 parsimonious 文法)支持单引号、双引号以及反斜杠转义。
注入 HTTPie 选项
除请求参数外,会话中还支持直接写入 HTTPie 的命令行选项:
> --form --auth user:pass > --verify=no # HTTPie 选项与请求参数混写在同一行 > --form --auth user:pass username=foo Content-Type:application/json选项被存放在上下文的options字典中,最终原样转交给 HTTPie。仓库的 http_prompt/options.py 给出了完整可补全的选项清单,例如:
- 标志类(Flag)选项:
--json/-j、--form/-f、--verbose/-v、--headers/-h、--body/-b、--stream/-S、--download/-d、--continue/-c、--follow、--check-status、--ignore-stdin、--traceback、--debug等; - 取值类(Value)选项:
--auth/-a、--auth-type(可选值basic/digest)、--verify(可选值no/yes)、--pretty(all/colors/format/none)、--style/-s、--print/-p、--output/-o、--proxy、--timeout、--cert、--cert-key、--session、--session-read-only、--raw等。
这些选项在补全时还会给出可选值提示(如输入--verify=后提示no/yes),交互体验接近真实 Shell。
命令预览:httpie 与 env
httpie:预览即将执行的命令
发送请求之前,可以用httpie命令查看 HTTP Prompt 将会以什么命令调用 HTTPie:
> httpie post http --auth user:pass --form POST http://localhost/api apikey==abc username=johnhttpie还支持临时覆盖:附加在httpie之后的选项与参数只会作用于本次预览,不会修改当前会话状态:
# 当前无任何参数 > httpie http http://localhost # 临时附加路径与参数 > httpie /api/something page==2 --json http --json http://localhost/api/something page==2 # 当前会话状态不受影响 > httpie http http://localhost预览命令的生成逻辑在 http_prompt/context/transform.py#L93-L101 的format_to_httpie():依次输出选项(--auth=user:pass形式)、方法名(大写)、URL 与请求参数,并用smart_quote对含空格的值加引号。文法中还预留了curl工具名(tool = "httpie" / "curl",见 http_prompt/execution.py#L97),不过当前format_to_curl尚未实现,会抛出NotImplementedError(http_prompt/context/transform.py#L83-L85),因此实际可用的预览工具是httpie。
env:打印当前会话状态
自 v0.6.0 起,env命令可以把当前会话输出为一段可回放/可保存的 HTTP Prompt 命令序列:
> env --verify=no cd http://localhost page==10 limit==20输出格式由 http_prompt/context/transform.py#L104-L110 的format_to_http_prompt()生成:先输出 HTTPie 选项,再输出cd <URL>,最后输出各请求参数。这个格式与保存/加载会话直接相关(见下文)。
发送请求:HTTP 方法与临时覆盖
在提示符中输入 HTTP 方法名即可发送真实请求:
> get > post > put > patch > delete > head > options # v0.8.0 新增文法层面(http_prompt/execution.py#L98-L99)还额外支持connect(对应 CONNECT 请求,可在 http_prompt/completion.py#L29-L38 的ACTIONS表中查到)。
与httpie一样,这些方法也支持临时覆盖——附加的参数与选项只作用于这一次请求:
# 当前无参数 > httpie http http://localhost # 发送一次带覆盖参数的 POST > post /api/v1 --form name=jane # 当前会话状态保持不变 > httpie http http://localhost请求的执行链路是:execute()解析命令 →ExecutionVisitor生成"临时上下文(context_override)"并与当前上下文合并 →_call_httpie_main()将上下文转换为参数列表调用httpie_main()(http_prompt/execution.py#L492-L510)。这里有一个值得一提的实现细节:HTTPie 本身不提供对外获取响应对象的 API,HTTP Prompt 借助sys.settrace()拦截 HTTPie 内部的get_response()来拿到响应,用于后续的 Cookie 自动处理(源码注释中自称 "super dirty hack")。
会话管理:输出重定向、保存与加载
输出重定向(v0.6.0)
任意命令的输出都可以重定向到文件,支持覆盖写入与追加两种模式:
# 覆盖写入 > COMMAND > /path/to/file # 追加写入 > COMMAND >> /path/to/file其中COMMAND可以是:
envhttpie- HTTP 动作:
get、post、put、patch、delete、head、options
重定向的底层实现是 http_prompt/execution.py#L296-L306:>以二进制写模式(wb)打开目标文件,>>以追加模式(ab)打开,并把输出对象从终端切换为文件写入器。注意文件路径会先经过os.path.expandvars(),因此支持$HOME之类的环境变量。
保存与加载会话
保存/加载会话是输出重定向的典型用途,尤其适合团队协作——把当前环境导出为文件,分享给队友一键加载。
保存:将env的输出重定向到文件:
> env > /path/to/file加载:使用source或exec。二者的唯一区别是:exec在加载前会先清空当前会话(rm *),source则是在当前会话基础上合并:
# 更新当前会话(合并) > source /path/to/file # 清空当前会话后再加载 > exec /path/to/file两者的实现可对照 http_prompt/execution.py#L314-L328:exec先执行execute('rm *', ...)清空上下文,再逐行执行文件内容;source则直接逐行执行。
命令行直接加载(v0.11.0):--env选项允许在启动时直接加载会话文件,配合 Shell 别名可以做到"每个项目一条命令启动、配置即载入":
# 为 project1 定义别名 $ alias http_project1='http-prompt --env /path/to/project1/env/file' # 启动 project1 的开发环境 $ http_project1命令行中的额外参数仍会被使用,并覆盖会话文件中已有的同名值:
# 加载会话,但覆盖 URL 并追加一个查询参数 $ http-prompt --env /path/to/file localhost:8080 page==2--env的解析与加载逻辑见 http_prompt/cli.py#L84-L85(要求文件已存在)与 http_prompt/cli.py#L143-L147;文件逐行回放的底层是 http_prompt/contextio.py#L23-L31 的load_context(),它把文件的每一行当作一条 HTTP Prompt 命令交给execute()。
保存 HTTP 响应
控制台适合查看小体积文本响应;对于较大的文本或二进制数据,把响应直接存为文件更合适:
# 先 cd 到资源地址,再把响应写到文件 > cd http://httpbin.org/image/png > get > pig.png # 或者一行搞定 > get http://httpbin.org/image/png > pig.png管道与 Shell 替换
管道(v0.7.0)
HTTP Prompt 支持简化的管道语法,可以把命令输出交给 Shell 命令继续处理:
# 用 sed 把 localhost 替换为 127.0.0.1 > httpie POST http://localhost | sed 's/localhost/127.0.0.1/' http http://127.0.0.1 # 用 grep 只打印包含 User-Agent 的行 > get http://httpbin.org/get | grep 'User-Agent' "User-Agent": "HTTPie/0.9.6" # macOS 上可以用 pbcopy 把结果复制到剪贴板 > httpie | pbcopy # 用 jq 解析 JSON 响应 > get http://httpbin.org/get | jq '.headers."User-Agent"' "HTTPie/0.9.6"注意:当前版本不支持多重管道(如cmd1 | cmd2 | cmd3),用法上限定为单级管道。实现上,visit_pipe通过Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)启动管道子进程,并把命令输出接入其标准输入;visit_immutation在结束时读取子进程的标准输出(http_prompt/execution.py#L308-L316)。
Shell 替换(v0.7.0)
把 Shell 命令放进一对反引号`...`中,即可从 Shell 环境计算出一个值并赋给参数:
# 把 date 的输出赋给查询参数 > date==`date -u +"%Y-%m-%d %H:%M:%S"` > httpie http http://localhost:8000 'date==2016-10-08 09:45:00' # 从文件读取密钥(假设文件内容为 secret_api_key) > password==`cat ./apikey.txt` > httpie http http://localhost:8000 password==secret_api_key实现位于 http_prompt/execution.py#L534-L537 的visit_shell_subs():用Popen(cmd, shell=True, stdout=PIPE)执行反引号内的命令,读取其标准输出并去掉末尾换行后作为参数值。这个语法在文法中(shell_subs)被允许出现在 unquoted/dquoted/squoted 三种字符串位置,因此`...`也可用于 key 或嵌入带引号的参数中。
配置:config.py 详解
自 v0.4.0 起,HTTP Prompt 首次启动时会自动创建用户配置文件:
- Linux/macOS:
$XDG_CONFIG_HOME/http-prompt/config.py,默认即~/.config/http-prompt/config.py - Windows:
%LOCALAPPDATA%/http-prompt/config.py,默认即~/AppData/Local/http-prompt/config.py
config.py是一个 Python 模块,内含全部可定制选项,直接用文本编辑器打开、按文件内的注释修改即可,无需 Python 基础。初始化逻辑见 http_prompt/config.py#L15-L29:若目标文件不存在,就把打包的默认配置 http_prompt/defaultconfig.py 复制过去。加载时则先读默认配置、再用用户配置覆盖(http_prompt/config.py#L64-L68)。
仓库的默认配置(http_prompt/defaultconfig.py)共 5 个选项,语义如下:
| 选项 | 默认值 | 含义与可选值 |
|---|---|---|
command_style | 'solarized' | 命令提示符的高亮主题。可选值:algol、algol_nu、autumn、borland、bw、colorful、default、emacs、friendly、fruity、igor、lovelace、manni、monokai、murphy、native、paraiso-dark、paraiso-light、pastie、perldoc、rrt、solarized、tango、trac、vim、vs、xcode |
output_style | None | HTTPie 输出高亮风格,可选值同command_style;设为None则使用 HTTPie 默认风格。该值会被写入会话选项--style(见 http_prompt/cli.py#L123-L125) |
pager | 'less' | 输出分页工具,可选'less'或'more'。注意more不支持 ANSI 彩色。CLI 启动时会据此设置PAGER环境变量(http_prompt/cli.py#L100-L101) |
set_cookies | 'auto' | 响应带Set-Cookie头时的处理策略:'auto'自动静默设置;'ask'询问用户是否设置;'off'忽略 |
vi | False | 编辑键位模式:True启用 Vi 风格键位,False使用 Emacs 风格键位(传入 prompt_toolkit 的vi_mode,见 http_prompt/cli.py#L159) |
其中set_cookies的具体行为由 http_prompt/cli.py#L59-L71 的ExecutionListener.response_returned()实现:当 HTTPie 返回的响应带 Cookie 时,按配置决定是否把 Cookie 合并进当前会话的请求头(auto/ask两种模式),设置后会在终端提示Cookies set: ...。
持久化上下文:context.hp 与隐私保护
HTTP Prompt 用一个名为context的数据结构表示当前会话。从 http_prompt/context/init.py#L4-L13 可以看到它由六部分组成:url、headers、querystring_params、body_params、body_json_params、options,外加退出标志should_exit和用于 OpenAPI 端点树的root。每当你输入一条修改上下文的命令,HTTP Prompt 就会把上下文序列化保存到文件系统,从而在重启http-prompt时无缝恢复上次会话。
- 会话文件位置:
$XDG_DATA_HOME/http-prompt/context.hp,默认~/.local/share/http-prompt/context.hp - Windows 上为
%LOCALAPPDATA%/http-prompt/context.hp,默认~/AppData/Local/http-prompt/context.hp
路径解析遵循 XDG Base Directory 规范(http_prompt/xdg.py),目录不存在时以0o700权限自动创建。
隐私提醒:上下文数据可能包含 API Key 等敏感信息,因此应保持用户数据目录私有。默认情况下,HTTP Prompt 将$XDG_DATA_HOME/http-prompt目录权限设为rwx------(即700),只有属主(你本人)可以读取。
持久化实现细节(http_prompt/contextio.py):
- 文件名常量
CONTEXT_FILENAME = 'context.hp'(http_prompt/contextio.py#L15); - 保存时调用
format_to_http_prompt()把上下文序列化为 HTTP Prompt 命令序列,其中--style选项被排除(EXCLUDED_OPTIONS = ['--style'],http_prompt/contextio.py#L12),目的是避免与用户配置文件中的output_style产生冲突; - 加载时逐行
execute()回放(http_prompt/contextio.py#L23-L31)。
旧版本用户须知:0.6.0 之前,HTTP Prompt 会按主机名和端口分组保存多个上下文;自 0.6.0 起只保存最近一次上下文。行为改变的原因是:多上下文分组功能完全可以被env、exec、source三个命令的组合取代,因而被精简掉了。
基于 OpenAPI/Swagger 的端点导航与自动补全
自 v0.10.0 起,HTTP Prompt 支持读取 OpenAPI(原名 Swagger)规范文件,为 API 端点路径与参数提供自动补全,并新增了ls命令用于浏览 API 结构。
通过 --spec 加载规范
--spec选项既支持本地文件,也支持网络上的 JSON 规范:
# 本地规范文件 $ http-prompt http://localhost:8000 --spec /path/to/spec.json # 网络上的规范(如各类公开 API 规范聚合站点) $ http-prompt https://api.github.com --spec https://api.apis.guru/v2/specs/github.com/v3/swagger.json加载逻辑见 http_prompt/cli.py#L73-L78 与 http_prompt/cli.py#L103-L117:本地路径会被转换为file:URL 并读取,远程 URL 直接下载;内容优先按 JSON 解析,JSON 解析失败时会尝试按 YAML 解析(yaml.safe_load),两者都失败则打印红色警告并忽略该规范。
如果启动时未显式给出 URL,HTTP Prompt 还能从规范本身推导默认地址:取schemes的第一项(缺省为https)作为协议,拼上host(缺省为http://localhost:8000)与basePath(见 http_prompt/context/init.py#L17-L23)。
用 ls 与 cd 浏览 API 端点
加载规范后,ls与cd可以像浏览文件系统一样浏览 API 端点,配合自动补全使用:
> ls users/ orgs/ > cd users > ls {username}/ > cd {username} > ls events/ orgs/底层实现是把规范中的所有路径构建成一颗树:Context.__init__遍历spec['paths'],把每个路径(如/users/{username}/events)拆分为路径段(users、{username}、events)逐层挂到根节点self.root上(http_prompt/context/init.py#L25-L36);路径参数(in: path以外的参数)也会作为叶子节点加入树中(http_prompt/context/init.py#L46-L72)。树节点定义在 http_prompt/tree.py:add_path()建树、ls()遍历子树,find_child()还支持通配符匹配——当输入与字面名不匹配时,会尝试匹配{...}形式的路径参数节点(http_prompt/tree.py#L47-L58),这正是上面cd {username}得以工作的原因。visit_ls在终端输出时会对目录类节点着色(http_prompt/execution.py#L338-L353)。
自动补全机制
HTTP Prompt 的补全基于 prompt_toolkit 的Completer接口(http_prompt/completer.py),核心是一组按当前输入匹配的正则规则(RULES),例如:
- 输入形如
xxx:时,补全常见 Header 值(如Content-Type:后提示application/json等,来自 http_prompt/completion.py#L100-L111 的CONTENT_TYPES与HEADER_VALUES); - 输入
get、post等方法名加空格后,补全已存在的 body/querystring 参数、Header 名与 HTTPie 选项; - 输入
ls、cd时,从 OpenAPI 构建的树中补全端点路径(仅目录节点,见 http_prompt/completer.py#L127-L139); - 输入
rm -b/-h/-q/-o时,分别补全当前已有的对应类型参数名; - 其他情况补全根命令(
cd、env、exec、exit、help、httpie、rm ...、source等,见 http_prompt/completion.py#L8-L27)。
补全匹配采用模糊匹配算法fuzzyfinder(http_prompt/completer.py#L48-L60),输入的部分字符即可命中候选;每个候选项还会附带说明文字(如GET request、Change URL/path、(=当前值)),已设置的参数会在补全描述中显示其当前值。
其他交互能力
与补全配套的还有:
- 语法高亮:基于 http_prompt/lexer.py 的
HttpPromptLexer(Pygments),方法、选项、参数等使用不同颜色; - 历史记录与自动建议:会话历史保存在数据目录的
history文件中(http_prompt/cli.py#L128),并启用AutoSuggestFromHistory()自动建议(http_prompt/cli.py#L158); help命令:打印全部命令、选项、动作与 Header 的说明清单(http_prompt/execution.py#L156-L170);clear命令:清屏。
退出与错误处理
输入exit结束会话(http_prompt/execution.py#L360-L362 中设置should_exit标志)。在提示符下按 Ctrl-C 可中断当前输入并留在会话中,按 Ctrl-D 直接退出(http_prompt/cli.py#L160-L163)。当输入无法被文法解析时,execute()会以红色提示Syntax error near "<片段>"(http_prompt/execution.py#L550-L556);删除不存在的 key 会提示Key '<名称>' not found。
结语与深入学习路径
至此,你已经掌握了 HTTP Prompt 的核心使用链路:安装启动 → 用四种运算符构造请求 → 注入 HTTPie 选项 → 预览与实际发送 → 通过重定向、env/source/exec/--env管理会话 → 借助管道与 Shell 替换做输出加工 → 用config.py定制行为 → 依靠context.hp实现会话持久化 → 最后用--spec把 OpenAPI 规范变成可导航、可补全的 API 目录。
如果想进一步深入实现细节,推荐按以下路径阅读当前仓库源码:
- 交互入口与启动流程:http_prompt/cli.py
- 命令文法与执行引擎:http_prompt/execution.py
- 会话上下文数据结构与 OpenAPI 解析:http_prompt/context/init.py
- 上下文序列化/反序列化:http_prompt/contextio.py
- 上下文到 HTTPie 命令的转换:http_prompt/context/transform.py
- 配置读写与默认配置:http_prompt/config.py、http_prompt/defaultconfig.py
- XDG 路径解析:http_prompt/xdg.py
- 自动补全规则与候选生成:http_prompt/completer.py、http_prompt/completion.py
- HTTPie 选项元数据:http_prompt/options.py
- OpenAPI 端点树:http_prompt/tree.py
- 对应测试用例:tests/test_execution.py、tests/test_contextio.py、tests/test_completer.py、tests/test_lexer.py
这些测试文件覆盖了命令解析、上下文持久化、补全与配置加载等关键行为,是理解各功能边界的最佳补充材料。
- 开发工具
- 接口测试
【免费下载链接】http-prompt
An interactive command-line HTTP and API testing client built on top of HTTPie featuring autocomplete, syntax highlighting, and more. https://twitter.com/httpie
相关推荐
OpenClaw Matrix 通道富消息规范:com.openclaw.presentation 元数据的设计与实现
OpenClaw Matrix 通道富消息规范:com.openclaw.presentation 元数据的设计与实现 OpenClaw 在向 Matrix 房
开发工具接口测试从0到1跑通RPCS3中文汉化:新手完整教程
从0到1跑通RPCS3中文汉化:新手完整教程 RPCS3 是一款高口碑的 PS3 模拟器,本文是一份从 0 到 1 的 RPCS3汉化教程,带你完成完整的 RP
虚拟化图形学调试器探索http-prompt:强大的交互式HTTP命令行客户端
探索http prompt:强大的交互式HTTP命令行客户端 http prompt是一个基于HTTPie和prompt_toolkit构建的交互式命令行HTT
开发工具接口测试
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考