夜天之书 #83 Web API 的开发工具和平台

news2024/12/29 1:50:09

上一篇文章《Web API 简介》的落脚点是 Web API 的体验。

Web API 作为许多软件的第一道门面,提升其体验的努力从来没有停止过。今天,围绕 Web API 的开发体验和使用体验,已经成长出一个庞大的软件生态。本文以常用的 Web API 开发工具和平台为切入点,介绍当前 Web API 的开发者基础设施。

终端工具

最初的 Web API 开发者显然是黑客,而黑客们的开发工具大多是终端工具,也就是不依靠图形化界面,而是以纯文本来交互的工具。

GNU wget

早期广为流传的 Web API 工具非 GNU wget[1] 莫属。今天,你仍然可以在许多软件的官方网站上看到形如 wget ... 的下载安装指南。

ef0f61f019f536d647ec1e1923f85d3c.png

GH Archive 网站提供了 wget 的下载指南

通过 man wget 可以查看其使用手册,共约 2000 行。wget 作为初代 Web API 工具,提供的是基础的下载网络资源的功能。随着网络技术的迭代,它会引入一系列新的参数来支持新的功能,但是整体还是偏向于简单,并且新参数的引入很有时代特色:后来的工具,往往能对早先的技术探索作扬弃和合并,但是一路跟进技术发展的工具,尤其是大众工具,常常因为需要保持向后兼容而不能移除跟进早期探索的不完美实现。

06d89df9077e6b5b40b3e4e908d19a84.png

wget 的手册

wget 支持的功能可以这么分类:

1.最基本的从一个指定的 URL 下载内容。2.定义下载内容存放到具体路径的系列参数。3.DNS 和代理解析的支持。4.下载的重试和超时参数。5.指定 HTTP 的各种具体参数,包括 Cookie 和 Header 等等。6.HTTPS (SSL/TLS) 相关的支持。

这也是后续所有 Web API 工具和平台的基本功能集必须包含的能力。

curl

如果说 wget 有一个后继者,那一定就是 curl[2] 了。

3c80c683222a23f60c4ad2bcc6a1bf15.png

许多软件提供基于 curl 的下载命令

wget 只支持 HTTP(S) 和 FTP 两种协议,而 curl 作为 Web API 开发的瑞士军刀,支持的网络通信协议就非常多了:

curl is a tool for transferring data from or to a server. It supports these protocols: DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. The command is designed to work without user interaction.

curl 的参考手册有 6000 余行,是 wget 的三倍。这都显示出 curl 的特点:大而全的功能。curl 对常见操作都做了专门的易用性优化,例如:

1.不同的 HTTP method 通过 -X 指定,例如常用的 -X POST 等。2.传入数据通过 -d 指定,并支持 -d @filename 从文件获取传入数据的方式。3.HTTP header 通过 -H 指定,比如 GitHub 请求时常用的鉴权信息就是以 -H "Authorization: ..." 的方式传入的,同样还有 -H "Accept: application/json" 指定数据编码信息。

把短参数交给常见操作的命名,可以看出 curl 是对开发者体验下过一番功夫的。

此外,curl 兼顾了终端用户和脚本的需求,即同时提供正交的参数设计和面向终端用户优化的聚合参数。

-X 和 -H 这样的通用参数,适合脚本批量生成结构化的 curl 命令。•-e 和 -A 这样的聚合参数,适合用户用更短的字符表达常用的操作。

由于 curl 设计当中的正交性和对多样功能的支持,Postman 提供了把请求导出为 curl 的功能。ReadMe 提供的页面内,从命令行提交 Web API 请求的也是一个 curl 命令。

jq

jq[3] 是一个非常年轻的命令行工具,专门用来分析 JSON 数据。从 2012 年开始开发,十年间已经获得 2.5 万个 star 的成绩。由于其广泛使用,甚至在 GitHub Actions 的官方 Runner 中都预装了这个软件。

3383166c6a7589c89d37a12c0958d0e6.png

jq star history

作为一个专门的 JSON 数据分析工具,它在 Web API 的开发工具中占据一席之地的原因,是目前几乎所有返回复杂结果的 Web API 都采用 JSON 的格式编码数据。

jq 最基本的使用方式是 curl ... | jq 也就是先用 curl 拉取数据,然后丢进 jq 处理器解析。哪怕什么参数都不带,jq 默认格式化 JSON 数据,也能极大提升一个长行返回结果的接口的体验,而 jq 默认将结果染色,也能极大改善阅读 API 返回结果的体验。

6c864a655c49d6f84ffd1d4d42e08931.png

除此以外,最常用的方法就是选择 JSON 文本的部分属性,筛选出感兴趣的内容。这在 REST API 总是无差别的返回大量内容的情况下尤为有用。

b64d332275c98b155f7e611a5bc9a131.png

HTTPie

HTTPie[4] 是 Web API 工具中从终端走向 Web UI 的一个尝试。

它在功能集上和 curl 没有太大的区别,但是在参数的设计上进一步简化了常见场景的交互方式。HTTPie 的基本命令如下:

http [METHOD] URL [REQUEST_ITEM ...]

其中 METHOD 指的是 GET / POST / PUT / DELETE 这样的 HTTP 方法。如果命令不传递任何输入数据,则默认用 GET 方法发送请求,否则默认用 POST 方法发送请求。

为了进一步简化 Headers 和输入数据的体验,HTTPie 对 REQUEST_ITEM 做了一定的编码约定:

REQUEST_ITEM
    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

此外,为了简化本地测试的键入内容,http :<port>/path 意味着向 localhost:<port>/path 发送请求。

最后,HTTPie 的输出默认就是以最佳阅读效果为目标上色的。

4b85b0011e3fb38a47d56bd135ebe087.png

可以看到,HTTPie 有很多专门为 Web API 开发者定制设计的特性,这也对得起它的定位:

HTTPie: modern, user-friendly command-line HTTP client for the API era.

HTTPie (pronounced aitch-tee-tee-pie) is a command-line HTTP client. Its goal is to make CLI interaction with web services as human-friendly as possible. HTTPie is designed for testing, debugging, and generally interacting with APIs & HTTP servers. The http & https commands allow for creating and sending arbitrary HTTP requests. They use simple and natural syntax and provide formatted and colorized output.

当然,跟 curl 对比起来,这样追求 human-friendly 的工具,自然也就不太适合机器或脚本自动生成规整的命令。

HTTPie 的团队提供了一个简易的 Web UI 工作台[5]

0be03a3cf70f76aa8e682af7ed1c3332.png

这个平台后端应该复用了 HTTPie Web 客户端的代码,但是跟命令行参数的解析应该就没什么关系了。这种通过 Web UI 填入参数和查看结果的做法,跟 Postman 的设计是高度一致的,适合不喜欢终端交互,更喜欢跟图形界面打交道的人。同时,Web UI 缓存用户数据的能力,也比命令行自己管理输入输出要省事儿不少。

Web API 平台

HTTPie 做 Web UI 是顺应 API 时代的潮流,在这个潮流下,大量的 Web API 平台应运而生。它们或者关注在 Web API 的设计,或者关注在开发和协作,或者关注在测试和自动化,或者关注在文档化。

除了测试和自动化大多是和通用框架结合,只是提供一些增强的构建块和测试断言,我认为没什么专门讲的价值,其余的几个主题本节各取一个代表介绍。

Swagger

严格来说,Swagger 是一个完整的 Web API 开发框架,不仅有 OpenAPI 标准定义 Web API 的接口协议,还有一整套工具生成代码、文档和在线调试。

但是 Swagger 最大的特色还是它的 OpenAPI 标准,即按照 REST API 的资源定义来描述当前 URL 下各个资源路径支持何种操作,传入参数和传出结果的类型和约束的一套标准。

例如,定义一个获取宠物信息的简单 REST 资源对应的 OpenAPI 配置片段如下:

paths:
  /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 代码。

5fd1c90d21617ca0d8508c4fa981293c.png

平台化开发、测试和自动文档化

OpenAPI 的生态非常繁荣,只要把 Web API 导出成 OpenAPI 的格式,基本就可以轻易地接入其他工具和平台做文档化、自动化测试和代码生成。

Postman

Postman[7] 可以说是 API 开发和协同平台最有名的创新团队,目前 API 平台商业化的龙头。HTTPie 的 Web UI 基本是 Postman 的一个极简青春版。

Postman 最基本的功能是帮助开发者调试应用开发时需要访问的一众 API 并保存测试结果。进一步地,Postman 对常见的请求参数构造做了集成,帮助开发者更快速全面地测试 API 的可用性。最后,Postman 面向 API 的设计者推出了一系列辅助设计和管理 API 的功能。

6ffc8e339df600d082b9d239e41762e1.png

Postman 的主页案例

Postman 的功能非常简单,但是它充当了连接开发者和服务提供方的重要桥梁。

在 Postman 上,你可以立即开始测试业务流程中对 Slack API 或者 Twitter API 的请求。国内的竞品 Apifox 抓住了这个重点,通过 API Hub[8] 提供了企业微信 API 和钉钉 API 等等业务实际依赖的服务的在线调试界面。

12bc4969fd508ccfe8cf97f2679608b1.png

ReadMe

ReadMe[9] 这个讨巧的域名对应的 API 平台服务专注于 API 文档及其用户旅程反馈。

上面提到的 Swagger 和 Postman 其实都提供了发布 API 文档和在线调试的能力,相较之下,ReadMe 提出的核心理念是:

Behind every API call is an API user. So why do your docs treat them all the same?

因此,它关注的不是 API 的开发,而是已有 API 并发布以后,用户实际在 API Doc 页面上调试的路径和正负反馈。

f42c0b31548a5168cbab84a19f749fb2.png

ReadMe 后台数据

API 开发的基础设施的意义

从面向黑客的命令行工具到 Web UI 开发设计平台,再到面向用户的 API 文档、测试和交流平台,Web API 的体验优化从提升开发者体验开始,最终惠及终端用户。

虽然 Web API 的体验最终是由用户定义的,但是开发 Web API 并改善其各方面体验的,是开发 API 的工程师。因此,提升他们的开发体验,改良他们手中的工具和开发平台,恰恰是优化用户体验的前提条件。

这跟手工艺者的工作变革是一致的:如果没有优良的机器和流水线,固然还会有少数能工巧匠能够做出高质量的工艺品,但是行业的平均水平和普通顾客能负担的产品整体质量是不足的。只有把最佳实践基础设施化,提高整个行业的基线,才能促进行业整体的进步。

开发 Web API 的工程师只有利用工具和平台节省在重复的实现和测试上的时间,才能有更多精力考虑如何设计出好的应用接口。软件应用之间通过好的接口集成组装,才有可能做出更加丰富的终端应用,最后改善终端用户的体验。

References

[1] GNU wget: https://www.gnu.org/software/wget/
[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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是 Java中的零拷贝

什么是零拷贝 WIKI中对其有如下定义&#xff1a; “Zero-copy” describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. 从WIKI的定义中&#xff0c;我们看到“零拷贝”是指计算机操作的过程中&#x…

数据库迁移 | 拥抱国产化数据库openGauss

Squids DBMotion再添新库同步能力&#xff0c;本期增加了对openGauss数据库的同步支持。 openGauss数据库是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验&#xff0c;结合企业级场景需求&#xff0c;持…

PFTL101B 20KN 3BSE004203R1主要介绍ACS380 Modbus通讯功能

​ PFTL101B 20KN 3BSE004203R1ABB系统优化船舶性能、效率和可持续性 根据经合组织的一份报告&#xff0c;货物和人员的海上运输是全球经济活动的重要驱动力&#xff0c;到2050年将增加两倍。据国际海事组织&#xff08;IMO&#xff09;称&#xff0c;这一增长将导致该行业的温…

Hi3861 移植 LVGL

一、前言 给 Hi3861 适配了硬件 spi &#xff0c;master 模式下最高 spi 速率可以达到 40M&#xff0c;用来驱动 oled 屏幕。 适配过程遇到了一个芯片bug&#xff0c;困扰了很久&#xff0c;clk 管脚驱动能力差&#xff0c;需要外接一个上拉电阻才能正常运行。适配完成移植 lvg…

k8s系列(五)——资源控制器

k8s系列五——资源控制器 控制器的必要性 自主式Pod对象由调度器调度到目标工作节点后即由相应节点上的kubelet负责监控其容器的存活状态&#xff0c;容器主进程崩溃后&#xff0c;kubelet能够自动重启相应的容器。但对出现非主进程崩溃类的容器错误却无从感知&#xff0c;这…

阿里下放自动驾驶,汽车业务是个坑,或是时候探讨下一个乐视了

阿里发布公告指达摩院自动驾驶团队将全部并入菜鸟集团&#xff0c;虽然并没有说关闭自动驾驶业务&#xff0c;但是自动驾驶业务已不再是阿里看重的业务&#xff0c;导致如此结果在于当前汽车行业发生的重大变化。 一、传统汽车开始发力 今年4月份的新能源汽车企业销量排名数据显…

配置gitee ssh免密拉取代码-唯一客服系统文档中心

Gitee 我们的客服系统代码托管于Gitee私有仓库默认情况下只用于开发者自我代码管理&#xff0c;不对外公布。如果你也是放在私有仓库进行托管&#xff0c;可以如下配置免密操作。 部署公钥免密拉取代码 部署公钥允许以只读的方式访问仓库&#xff0c;主要用于仓库在生产服务器的…

即时通讯在线聊天APP开发解决方案

即时通讯是目前移动端最为流行的通讯方式&#xff0c;各种各样的即时通讯软件也层出不穷&#xff1b;服务提供商也提供了越来越丰富的通讯服务功能&#xff0c;打造一个实时通信系统&#xff0c;允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。今天河北领行…

Excel中时间戳与标准日期格式的互相转换

背景 在excel中将13位毫秒级别的时间戳转换为标准的日期格式(yyyy-mm-dd hh:mm:ss.000)&#xff0c;使用如下模板 TEXT(<source_cell>/1000/8640070*36519,"yyyy-mm-dd hh:mm:ss.000") 在excel中将10位秒级别的时间戳转换为标准的日期格式(yyyy-mm-dd hh:mm:ss…

每日学习记录

GDB调试 首先是安装&#xff0c;以及普通的一些命令&#xff0c;重点是如何打断点 调试多进程和多线程 不同的gdb版本可能不是很支持&#xff0c;需要用比较新的版本>8.3 多进程 fork()函数创建一个一模一样的进程正常来说&#xff0c;同一个执行文件&#xff0c;gdb只…

使用 CNN 进行面部情绪识别

面部表情是人类之间交流的重要方式。 在人工智能研究中&#xff0c;深度学习技术已成为增强人机交互的强大工具。心理学中面部表情和情绪的分析和评估涉及评估预测个人或群体情绪的决定。 本研究旨在开发一种能够使用卷积神经网络&#xff08;CNN&#xff09;算法和特征提取技术…

【Java每日一练】总目录(2023.3.11~5.18)共69篇

2023.3.11~2023.5.18 连载两个多月共69篇&#xff0c;暂停更 Java 2023.05 2023.5.11-2023.5.18 20230518 1. 移除链表元素 &#x1f31f; 2. 跳跃游戏 II &#x1f31f;&#x1f31f; 3. 复原 IP 地址 &#x1f31f;&#x1f31f; 20230517 1. 存在重复元素 &#x…

chatgpt赋能Python-pycharm添加库

Pycharm添加库 – 提高Python编程效率的绝佳利器 Pycharm是一款强大的Python IDE&#xff0c;为广大Python开发人员提供了高度集成化的开发环境。通过Pycharm&#xff0c;我们可以充分利用各种强大的开发工具来简化开发流程&#xff0c;提高编程效率。其中一项重要的功能就是添…

SciPy库(一)常数与特殊函数与插值

一、概述 SciPy是一个开源的Python科学计算库&#xff0c;它建立在NumPy之上&#xff0c;提供了许多有用的科学计算功能。SciPy包括各种科学计算模块&#xff0c;如线性代数、优化、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理等。SciPy库的主要特点是其高效性和…

突然放大,Midjourney 来中国了!

突然放大&#xff0c;Midjourney 来中国了&#xff01; 一、 Midjourney内测版本的推出 Midjourney&#xff0c;一款新颖的 AI 视觉艺术平台&#xff0c;近日在中国开放了内测版。这个内测版本在 QQ 频道上进行&#xff0c;每周一和周五的 18:00 开放入口&#xff0c;人数一旦满…

家里宽带申请公网 IP(二)

来源&#xff1a;公众号【鱼鹰谈单片机】 作者&#xff1a;鱼鹰Osprey ID &#xff1a;emOsprey 在之前的《家里宽带搞个服务器&#xff0c;YYDS&#xff08;一&#xff09;》笔记中大概介绍了&#xff0c;因为现有的 IPv4 的地址资源枯竭&#xff0c;导致大部分网络都是局域…

中国系统正式发声!所有用户永久免费,网友:再见了,CentOS!

点关注公众号&#xff0c;回复“1024”获取2TB学习资源&#xff01; 如果说&#xff1a;没有操作系统会怎么样&#xff1f; 对于个PC来说&#xff0c;无论是台式机、笔记本、平板等等&#xff0c;一切都变的一无是处&#xff0c;这些硬件对我们来说&#xff0c;和一堆废铁没什么…

手把手写一个简单IOC(基于XML配置文件)

目录 创建模块 准备测试阶段测试用的Bean 编写ApplicationContext接口 编写ClassPathXmlApplicationContext 确定采用Map集合存储Bean 解析配置文件实例化所有Bean 解析配置文件实例化所有Bean 测试阶段1(实例化bean) Bean的属性赋值 测试阶段2(为bean对象进行赋值)…

初阶数据结构——栈和队列习题

目录 括号匹配问题思路代码 用队列实现栈思路注意点代码 用栈实现队列思路代码 设计循环队列思路数组实现代码链表实现代码 括号匹配问题 OJ链接 思路 是左括号则入栈&#xff0c;是右括号则出栈然后两两比较 代码 #include<stdio.h> #include<stdlib.h> #i…

洛谷P1157详解(两种解法,一看就会)

一、问题引出 组合的输出 题目描述 排列与组合是常用的数学方法&#xff0c;其中组合就是从 n n n 个元素中抽出 r r r 个元素&#xff08;不分顺序且 r ≤ n r \le n r≤n&#xff09;&#xff0c;我们可以简单地将 n n n 个元素理解为自然数 1 , 2 , … , n 1,2,\dot…