终端工具
最初的 Web API 开发者显然是黑客,而黑客们的开发工具大多是终端工具,也就是不依靠图形化界面,而是以纯文本来交互的工具。
GNU wget
wget 支持的功能可以这么分类:
curl
1.不同的 HTTP method 通过 -X 指定,例如常用的 -X POST 等。
2.传入数据通过 -d 指定,并支持 -d @filename 从文件获取传入数据的方式。3.HTTP header 通过 -H 指定,比如 GitHub 请求时常用的鉴权信息就是以 -H "Authorization:..." 的方式传入的,同样还有 -H "Accept:application/json" 指定数据编码信息。
•-X 和 -H 这样的通用参数,适合脚本批量生成结构化的 curl 命令。
•-e 和 -A 这样的聚合参数,适合用户用更短的字符表达常用的操作。
由于 curl 设计当中的正交性和对多样功能的支持,Postman 提供了把请求导出为 curl 的功能。ReadMe 提供的页面内,从命令行提交 Web API 请求的也是一个 curl 命令。
jq
HTTPie
HTTPie[4] 是 Web API 工具中从终端走向 Web UI 的一个尝试。
Optional key-value pairs to be included in the request. The separator used
determines the type:
':' HTTP headers:
Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0
'==' URL parameters to be appended to the request URI:
search==httpie
'=' Data fields to be serialized into a JSON object (with --json, -j)
or form data (with --form, -f):
name=HTTPie language=Python description='CLI HTTP client'
':=' Non-string JSON data fields (only with --json, -j):
awesome:=true amount:=42 colors:='["red", "green", "blue"]'
'@' Form file fields (only with --form or --multipart):
cv@~/Documents/CV.pdf
cv@'~/Documents/CV.pdf;type=application/pdf'
'=@' A data field like '=', but takes a file path and embeds its content:
essay=@Documents/essay.txt
':=@' A raw JSON field like ':=', but takes a file path and embeds its content:
package:=@./package.json
You can use a backslash to escape a colliding separator in the field name:
field-name-with\:colon=value
最后,HTTPie 的输出默认就是以最佳阅读效果为目标上色的。
可以看到,HTTPie 有很多专门为 Web API 开发者定制设计的特性,这也对得起它的定位:
HTTPie 的团队提供了一个简易的 Web UI 工作台[5]。
Web API 平台
HTTPie 做 Web UI 是顺应 API 时代的潮流,在这个潮流下,大量的 Web API 平台应运而生。它们或者关注在 Web API 的设计,或者关注在开发和协作,或者关注在测试和自动化,或者关注在文档化。
除了测试和自动化大多是和通用框架结合,只是提供一些增强的构建块和测试断言,我认为没什么专门讲的价值,其余的几个主题本节各取一个代表介绍。
Swagger
严格来说,Swagger 是一个完整的 Web API 开发框架,不仅有 OpenAPI 标准定义 Web API 的接口协议,还有一整套工具生成代码、文档和在线调试。
/pet:
put:
tags:
- pet
summary: Update an existing pet
description: Update an existing pet by Id
operationId: updatePet
requestBody:
description: Update an existent pet in the store
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
application/xml:
schema:
$ref: '#/components/schemas/Pet'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/Pet'
required: true
responses:
'200':
description: Successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
application/xml:
schema:
$ref: '#/components/schemas/Pet'
'400':
description: Invalid ID supplied
'404':
description: Pet not found
'405':
description: Validation exception
喜欢就点个"在看"呗^_^
这些定义就像 Kubernetes Operator 领域里的 CRD 那样,通常都不是人写的,而是使用 swagger-core[6] 一类的库先用某种程序设计语言写出 REST API 的定义和实现,再转成 OpenAPI 的定义。而后,如果要提供其他语言的客户端或服务端实现,再从 OpenAPI 标准的定义里生成对应的 stub 代码。
Postman
Postman[7] 可以说是 API 开发和协同平台最有名的创新团队,目前 API 平台商业化的龙头。HTTPie 的 Web UI 基本是 Postman 的一个极简青春版。
ReadMe
API 开发的基础设施的意义
从面向黑客的命令行工具到 Web UI 开发设计平台,再到面向用户的 API 文档、测试和交流平台,Web API 的体验优化从提升开发者体验开始,最终惠及终端用户。
虽然 Web API 的体验最终是由用户定义的,但是开发 Web API 并改善其各方面体验的,是开发 API 的工程师。因此,提升他们的开发体验,改良他们手中的工具和开发平台,恰恰是优化用户体验的前提条件。
这跟手工艺者的工作变革是一致的:如果没有优良的机器和流水线,固然还会有少数能工巧匠能够做出高质量的工艺品,但是行业的平均水平和普通顾客能负担的产品整体质量是不足的。只有把最佳实践基础设施化,提高整个行业的基线,才能促进行业整体的进步。
开发 Web API 的工程师只有利用工具和平台节省在重复的实现和测试上的时间,才能有更多精力考虑如何设计出好的应用接口。软件应用之间通过好的接口集成组装,才有可能做出更加丰富的终端应用,最后改善终端用户的体验。
References
[2]curl: https://curl.se/
[3]jq: https://stedolan.github.io/jq/
[4]HTTPie: https://httpie.io/
[5]Web UI 工作台: https://httpie.io/app
[6]swagger-core: https://github.com/swagger-api/swagger-core/wiki
[7]Postman: https://www.postman.com/
[8]API Hub: https://apifox.com/apihub/
[9]ReadMe: https://readme.com/
CommunityOverCode Asia 2023强势来袭!15大专题等你投稿!
本文分享自微信公众号 - 开源社KAIYUANSHE(kaiyuanshe)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。