Web API 路径设计哪家强

本文档主要比较一下各家API的URL路径设计,通过学习各家API的URL路径设计,加深对 REST API 的理解,帮助我们设计出更符合 REST 风格的 API。

Google

  • API 文档地址:https://developers.google.com/apis-explorer/#p/

YouTube Data API

  • API 文档地址:YouTube Data API
  • API 前缀:https://www.googleapis.com/youtube/v3

播放列表 API

  • 创建播放列表:POST /playlists
  • 查询播放列表集合:GET /playlists
  • 更新播放列表:PUT /playlists
  • 删除播放列表:DELETE /playlists

视频 API

  • 上传视频:POST /videos
  • 查询列表:GET /videos
  • 更新视频信息:PUT /videos
  • 删除视频:DELETE /videos
  • 为视频评分:POST /videos/rate
  • 获取视频评分:GET /videos/getRating

Calendar API

  • API 文档地址:Calendar API
  • API 前缀:https://www.googleapis.com/calendar/v3

日历 API

  • 创建辅助日历:POST /calendars
  • 查询日历:GET /calendars/{calendarId}
  • 更新/补丁日历:PUT/PATCH /calendars/{calendarId}
  • 删除服务日历:DELETE /calendars/{calendarId}
  • 清除主日历:POST /calendars/calendarId/clear

事件 API

  • 创建事件:POST /calendars/calendarId/events
  • 查询日历中的事件:GET /calendars/calendarId/events
  • 查询单个事件:GET /calendars/calendarId/events/eventId
  • 更新事件:``PUT /calendars/calendarId/events/eventId`
  • 删除事件:DELETE /calendars/calendarId/events/eventId
  • 移动事件:POST /calendars/calendarId/events/eventId/move

Gmail API

  • API 文档地址:Gmail API
  • API 前缀:https://gmail.googleapis.com

标签 API

  • 创建标签:POST /gmail/v1/users/{userId}/labels
  • 查询标签列表:GET /gmail/v1/users/{userId}/labels
  • 获取指定标签:GET /gmail/v1/users/{userId}/labels/{id}
  • 更新标签:PUT /gmail/v1/users/{userId}/labels/{id}
  • 删除标签:DELETE /gmail/v1/users/{userId}/labels/{id}

消息 API

  • 发送消息:POST /gmail/v1/users/{userId}/messages/send
  • 查询消息列表:GET /gmail/v1/users/{userId}/messages
  • 获取指定消息:GET /gmail/v1/users/{userId}/messages/{id}
  • 删除消息:DELETE /gmail/v1/users/{userId}/messages/{id}
  • 修改邮件标签:POST /gmail/v1/users/{userId}/messages/{id}/modify
  • 批量修改邮件标签:POST /gmail/v1/users/{userId}/messages/batchModify
  • 批量删除邮件:POST /gmail/v1/users/{userId}/messages/batchDelete

批量修改和批量删除的操作 API 是 POST 方法,略违和。

观察结果

  1. 结构基本为:/ product_line / version / {namespace} / resource / {resourceId} / action

    • product_line:产品线,区分不同产品,比如 gmail、calendar、adsense
    • version:版本,区分不同版本,比如 v1、v2
    • namespace:命名空间(可选)。可以用来帮助组织区分 API,做不同的访问控制等处理。
    • resource:资源,比如 gmail 下的 messages、labels,使用名词。
    • resourceId:资源ID(可选),比如 gmail 下的 messageId
    • action:动作,对资源进行的操作, 使用动词。
  2. 基本使用同一个域名 www.googleapis.com,当然也有例外,比如 Gmail API 使用 https://gmail.googleapis.com

  3. 使用名词表示资源,命名使用复数。

  4. 使用动词或者动词短语表示操作(action)。

  5. 对于多个单词的标识符使用驼峰命名。

  6. YouTube API 和 Calendar API 对 resourceId 的传参处理不一样。YouTube API 是放在 URL query 或者 body中,而 Calendar API 是放在 URL path 中。(PS:我个人工作中更多的使用 Calendar API 的这种处理方式)

PayPal

  • API 文档地址:PayPal API
  • API 前缀:https://api.paypal.com

API 示例

  • 查询授权:GET /v2/payments/authorizations/{authorization_id}

  • 创建订单:POST /v2/checkout/orders

  • 更新订单:PATCH /v2/checkout/orders/{order_id}

  • 查询订单:GET /v2/checkout/orders/{order_id}

  • 创建发票:POST /v2/invoicing/invoices

  • 发送发票:POST /v2/invoicing/invoices/{invoice_id}/send

  • 查询发票列表:GET /v2/invoicing/invoices

  • 查询发票:GET /v2/invoicing/invoices/{invoice_id}

  • 删除发票:DELETE /v2/invoicing/invoices/{invoice_id}

  • 删除外部支付:DELETE /v2/invoicing/invoices/{invoice_id}/payments/{transaction_id}

  • 生成二维码:POST /v2/invoicing/invoices/{invoice_id}/generate-qr-code

观察结果

  • 域名: 生产 https://api.paypal.com;沙盒 https://api-m.sandbox.paypal.com
  • 结构:/ version / namespace / resource / {resourceId} / action
  • PayPal API 的结构相对比较干净统一
  • 资源命名使用复数
  • 使用动词或者动词短语表示操作(action)
  • 使用中划线 - 作为分隔符

AWS

  • API 文档地址:AWS API

关于域名,AWS使用了一种完全不一样的方案。不同的产品线和不同的地区(region)会有不一样的域名。

S3 域名

参考文档:S3 域名

  • 美国东部 (弗吉尼亚北部):s3.us-east-1.amazonaws.com
  • 亚太区域 (香港):s3.ap-east-1.amazonaws.com
  • 亚太区域 (东京):s3.ap-northeast-1.amazonaws.com

EC2 域名

参考文档:EC2 域名

  • 美国东部 (弗吉尼亚北部):ec2.us-east-1.amazonaws.com
  • 亚太区域 (香港):ec2.ap-east-1.amazonaws.com

基本上来说,格式是:product_name.regions_name.amazonaws.com/?Action=Function

API 示例

  • 查询实例: /ec2.us-east-1.amazonaws.com/?Action=DescribeInstances
  • 启动实例:https://ec2.amazonaws.com/?Action=StartInstances
  • 创建 VPC: /ec2.us-east-1.amazonaws.com/?Action=CreateVpc
  • 创建 Volume: /ec2.us-east-1.amazonaws.com/?Action=CreateVolume

Github

  • API 文档地址:Github API
  • API 域名:https://api.github.com

API 示例

  • 取所有 repo:GET /orgs/{org}/repos
  • 取特定用户名的repo:/repos/{owner}/{repo}
  • 取某个仓库所有的PR:GET /repos/{owner}/{repo}/pulls
  • 创建 PR:POST /repos/{owner}/{repo}/pulls
  • 查询 PR:GET /repos/{owner}/{repo}/pulls/{pull_number}
  • 更新 PR:PATCH /repos/{owner}/{repo}/pulls/{pull_number}
  • Merge PR:PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge
  • 取自己的issue:GET /user/issues
  • 取某个repo下的issue:GET /repos/{owner}/{repo}/issues
  • 取用户:GET /users/{username}
  • 取组织下的所有的项目:GET /orgs/{org}/projects

观察结果

  1. 结构:/resource/ {id} / resource
  2. Github的API没有版本号,也没有namespace,直接就是 resource 开头。
  3. URL 就是在不同的 resource 下进行组合和 join。

Dropbox

  • API 文档地址:Dropbox API
  • API 域名:https://api.dropboxapi.com

API 示例

  • POST /2/file_properties/templates/add_for_user

  • POST /2/file_properties/templates/get_for_user

  • POST /2/file_properties/templates/remove_for_user

  • POST /2/file_properties/templates/update_for_user

  • POST /2/file_requests/create

  • POST /2/files/create_folder_v2

  • POST /2/users/get_account_batch

  • POST /2/paper/docs/list

观察结果

  1. 结构:/version / resource / actions

  2. Dropbox 的 API 是在resource 上建各种函数。除了有个总版本,函数上还可以有版本,比如 /2/files/create_folder_v2

  3. 请求方法 POST 一把梭!

  4. 对于多个单词的 action,使用了下划线 _ 作为分隔符。关于下划线,在最初的 RFC1738 中规定不合法,但是,RFC1738 被 RFC2396更新了,RFC 2396 允许使用下划线为“unreserved character”,而2015年的时候 RFC 3986(URI现代标准) 更新了 RFC 2396,继续将下划线归类为非保留字符,可以在以下组件中可以直接使用:

  • path
  • query
  • fragment

以下是 RFC 3986 中的相关描述:

Characters that are allowed in a URI but do not have a reserved
purpose are called unreserved. These include uppercase and lowercase
letters, decimal digits, hyphen, period, underscore, and tilde.

unreserved = ALPHA / DIGIT / “-” / “.” / “_” / “~”

Twitter

  • API 文档地址:Twitter API
  • API 域名:api.twitter.com/(普通api) ads-api.twitter.com(广告用)

API 示例

  • 获取粉丝列表:GET /2/users/:id/followers

  • 获取正在关注列表:GET /2/users/:id/following

  • 关注用户:POST /2/users/:id/following

  • 取消关注:DELETE /2/users/:source_user_id/following/:target_user_id

  • 获取用户列表:GET /2/users/:id/list_memberships

  • 更新列表:PUT /2/lists/:id

  • 创建列表:POST /2/lists

  • 删除列表:DELETE /2/lists/:id

观察结果

  1. 结构:/version / resource /action
  2. Twitter 的 API 结构也很标准,版本号放在最前面。
  3. 对于 resource 的命名用复数
  4. 使用下划线 _ 作为分隔符

Stripe

  • API 文档地址:Stripe API
  • API 域名:https://api.stripe.com

API 示例

  • 获取余额:GET /v1/balance

  • 获取余额交易列表:GET /v1/balance_transactions

  • 获取余额交易:GET /v1/balance_transactions/:id

  • 创建客户:POST /v1/customers

  • 获取客户列表:GET /v1/customers

  • 更新客户:POST /v1/customers/:id

  • 获取客户详情:GET /v1/customers/:id

  • 删除客户:DELETE /v1/customers/:id

  • 搜索客户:GET /v1/customers/search

  • 创建支付方式:POST /v1/payment_methods

  • 获取支付方式详情:GET /v1/payment_methods/:id

  • 获取客户支付方式:GET /v1/customers/:id/payment_methods/:id

  • 创建支付意图:POST /v1/payment_intents

  • 获取支付意图详情:GET /v1/payment_intents/:id

观察结果

  • 结构:/version/resource/id/action
  • 其更新操作用了 POST 而不是 PUT 方法
  • 对于子资源的区分,使用下划线 _ 作为分隔符。(PS:感觉使用 namespace + subresource 的形式区分子资源会更好一些,即 GET /v1/payment/methods/:idGET /v1/payment/intents 这样。)
  • 所有 POST 请求,通过 Idempotency-Key 请求头来实现幂等。
curl https://api.stripe.com/v1/customers \-u sk_test_Ou1w6LVt3zmVipDVJsvMeQsc: \-H "Idempotency-Key: KG5LxwFBepaKHyUD" \

Trello

  • API 文档地址:Trello API
  • API 域名:https://api.trello.com

API 示例

  • 获取 Action详情:GET /1/actions/{id}

  • 获取 Action 卡片:GET /1/actions/{id}/card

  • 获取 Action 看板:GET /1/actions/{id}/board

  • 更新 Action 文本:PUT /1/actions/{id}/text

  • 创建 Action 的回应:POST /1/actions/{idAction}/reactions

  • 获取 Action 的回应:GET /1/actions/{idAction}/reactions/{id}

  • 删除 Action 的回应:DELETE /1/actions/{idAction}/reactions/{id}

  • 创建卡片:POST /1/cards

  • 获取卡片详情:GET /1/cards/{id}

  • 更新卡片:PUT /1/cards/{id}

  • 删除卡片:DEL /1/cards/{id}

  • 获取卡片特定属性:GET /1/cards/{id}/{field}

  • 获取卡片附件:GET /1/cards/{id}/attachments

  • 创建卡片附件:POST /1/cards/{id}/attachments

  • 获取卡片附件:GET /1/cards/{id}/attachments/{idAttachment}

  • 删除卡片附件:DEL /1/cards/{id}/attachments/{idAttachment}

观察结果

  1. 结构:/version/resource/{id}/subResource/{subId}
  2. 非常标准的 Restful API 实现,中规中矩,I like it !

Tencent

微信公众号

  • API 文档地址:微信公众号 API
  • 域名:
    • 主域名:api.weixin.qq.com
    • 灾备域名:api2.weixin.qq.com
  • 区域域名:sh.api.weixin.qq.com, sz.api.weixin.qq.com, hk.api.weixin.qq.com

API 示例

  • 获取用户列表:GET /cgi-bin/user/get

  • 获取用户信息:GET /cgi-bin/user/info

  • 设置用户备注:POST /cgi-bin/user/info/updateremark

  • 查询卡劵:POST /cgi-bin/card/code/get

  • 核销卡劵:POST /cgi-bin/card/code/consume

  • 新增永久素材:POST /cgi-bin/material/add_material

  • 获取永久素材:POST /cgi-bin/material/get_material

  • 删除永久素材:POST /cgi-bin/material/del_material

  • 获取素材总数:GET /cgi-bin/material/get_materialcount

  • 获取素材列表:POST /cgi-bin/material/batchget_material

微信支付

  • API 文档地址:微信支付 API
  • 域名:api.mch.weixin.qq.com,备域名:api2.mch.weixin.qq.com

API 示例

  • app 下单:POST /v3/pay/transactions/app

  • h5 下单:POST /v3/pay/transactions/h5

  • 小程序下单:POST /v3/pay/transactions/jsapi

  • 查询订单:GET /v3/pay/transactions/out-trade-no/{out_trade_no}

  • 关闭订单:POST /v3/pay/transactions/out-trade-no/{out_trade_no}/close

  • 申请退款:POST /v3/refund/domestic/refunds

  • 创建支付分订单:POST /v3/payscore/serviceorder

  • 查询支付分订单:GET /v3/payscore/serviceorder/

  • 取消支付分订单:POST /v3/payscore/serviceorder/{out_order_no}/cancel

  • 核销用户券:POST /v3/marketing/busifavor/coupons/use

腾讯开放平台

  • API 文档地址:腾讯开放平台 API
  • 域名:graph.qq.com

API 示例

  • 获取 QQ 用户信息:GET /user/get_user_info

腾讯云

  • API 文档地址:腾讯云 API
  • 域名:cvm.tencentcloudapi.com

API 实例

腾讯云的 API 文档没有 API 路径,所有操作都是通过请求 body 或者 params 里的 Action 来区分。

  • 启动实例:GET https://cvm.tencentcloudapi.com/?Action=StartInstances
  • 关闭实例:GET https://cvm.tencentcloudapi.com/?Action=StopInstances

观察结果

  1. 有多个域名,用于不同的产品线。
  2. 微信、QQ 的 API 风格差不多基本都是 /resource/action 的方式
  3. 腾讯云的 API 没有 URL,全部是直接请求域名即可。通过请求 body 或者 params 里的 Action 来区分。

总结

  • 大部分都符合 Restful API 的设计,围绕 resource 和 action 来设计,增删改查使用对应的 HTTP 方法。
  • 结构大部分使用 /version/resource/{id}/action 这种形式。
  • resource 命名使用复数;用动词或者动词短语表示操作(action)。
  • 对于多个单词的标识符使用中划线 - 或者下划线 _ 作为分隔符,也有驼峰命名法。个人更喜欢中划线 - 作为分隔符,无论在命令行还是浏览器里,更容易识别。
  • AWS 和 腾讯云的 API 设计比较特殊,没有使用 URL 来区分不同的资源,而是使用 Action 字段区分,是一种 RPC 风格的设计。

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

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

相关文章

微信小程序中的计算属性库-miniprogram-computed

miniprogram-computed 是一个用于微信小程序的扩展库,它提供了计算属性(computed)和监听器(watch)的功能,类似于 Vue.js 中的计算属性和监听器。以下是使用 miniprogram-computed 的详细步骤: …

【CSS-7】深入解析CSS伪类:从基础到高级应用

CSS伪类是前端开发中不可或缺的强大工具,它们允许我们根据文档树之外的信息或简单选择器无法表达的状态来样式化元素。本文将全面探讨CSS伪类的各种类型、使用场景和最佳实践。 1. 伪类基础概念 1.1 什么是伪类? 伪类(Pseudo-class&#x…

蓝桥杯国赛训练 day4

目录 再创新高 蓝桥大使 表演赛 次数差 再创新高 import java.math.*; import java.util.*;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t 1; // tsc.nextInt();for(int i0;i<t;i) {solve();}} p…

java 高并发设计

文章目录 目录 文章目录 前言 一、通用设计 一、动静分离 二、数据库独立部署 三、问题 1.高并发通用设计方法 2.高并发系统的拆分顺序 二、计算资源高并发 三、网络资源高并发 超高性能场景&#xff08;10万 QPS&#xff09; 中小规模场景&#xff08;5万 QPS以下&a…

docker compose搭建elk 8.6.2

环境搭建 选用版本是比较新的版本 (ELK) 8.6.2 &#xff0c;elk的环境做的还是比较好的又windows和Linux多个版本&#xff0c;并且开箱即用。本地直接下载官方软件也是可以的。最近在学习docker compose&#xff0c;就使用这个环境搭建一下。 前置条件 安装好docker和 docke…

Springboot3+的id字符串转化问题

以下是纯后端实现 Long/BigInteger ID 转为 JSON 字符串 的详细配置方案&#xff0c;基于 Spring Boot 3 和 SpringDoc (OpenAPI) 最新实践 ✨ 1. 添加依赖 确保你的 pom.xml&#xff08;或 Gradle&#xff09;中包含&#xff1a; <dependency><groupId>com.fast…

C#学习第30天: 匹配模式

模式匹配&#xff08;Pattern Matching&#xff09;是 C# 中一个强大且灵活的特性&#xff0c;允许开发者以更直观的方式检查数据结构&#xff0c;并根据特定模式执行操作。 随着 C# 语言版本的发展&#xff0c;模式匹配的功能越来越丰富&#xff0c;为处理复杂数据提供了极大…

SQL进阶之旅 Day 29:NoSQL结合使用策略

【SQL进阶之旅 Day 29】NoSQL结合使用策略 文章简述 随着数据量的激增和业务场景的复杂化&#xff0c;传统关系型数据库在某些场景下已难以满足高性能、高扩展性和灵活数据结构的需求。NoSQL&#xff08;非关系型数据库&#xff09;以其高可扩展性、灵活的数据模型和分布式架构…

PostgreSQL 对 IPv6 的支持情况

PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议&#xff0c;包括连接、存储和操作 IPv6 地址。以下是详细说明&#xff1a; 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置&#xff1a; listen_addresses 0.0.0.0,:: # 监听所有IPv4…

模板字符串使用点击事件【VUE3】

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目中使用模板字符串的时候很多&#xff0c;有些时候需要再模板字符串中使用点击事件&#xff0c;那么在模板字符串中可以使用点击事件么&#xff1f;如果这个点击事件需要传参呢&#xff1f; 答案…

AI——DeepSeek+LangChain+streamlit 实现智能汽车维修服务

效果图 分析流程 代码实现 废话少说&#xff0c;直接上代码 from langchain_core.language_models.llms import BaseLLM from langchain_core.outputs import Generation, LLMResult from pydantic.v1 import Field, validator from typing import Any, Dict, List, Optional…

《C++ 继承》

目录 继承的定义 继承类模板 派生类和基类之前的转换 隐藏 派生类的默认成员函数 不能被继承的类 继承中的友元和静态成员 继承模型 继承的定义 继承的本质是一种复用。规定Person类为基类&#xff0c;Student类为派生类 。 继承方式分为public继承&#xff0c;prote…

金蝶K3 ERP 跨网段访问服务器卡顿问题排查和解决方法

我一朋友公司反应&#xff0c;公司网络卡顿&#xff0c;测试掉包严重&#xff0c;抓包wireshark测试&#xff0c;发现arp包有大量mac欺骗&#xff0c;因为公司有几百台电脑&#xff0c;所以建议更换了三层交换机&#xff0c;划分了vlan&#xff0c;这样有效的避免了网络风暴等&…

无需安装!在线数据库工具 :实战 SQL 语句经典案例

在数字化时代&#xff0c;SQL&#xff08;结构化查询语言&#xff09;已成为数据从业者、开发人员乃至业务分析人员必备的核心技能。无论是处理日常数据报表&#xff0c;还是应对复杂的业务逻辑&#xff0c;SQL 都能高效实现数据的查询、操作与分析。本文将通过经典的 SQL 练习…

如何在网页里填写 PDF下拉框

对于PDF 开发者或网页开发者来说&#xff0c;让用户在网站上填写 PDF 下拉框&#xff08;Combo Box&#xff09;是一个棘手的问题。因为 PDF 并不是一种原生的 Web 格式&#xff0c;浏览器通常不允许用户与 PDF 下拉框进行交互。 那么&#xff0c;如何让用户在 HTML 中填写 PD…

.Net 优秀框架 ABP全面详解

文章目录 第一部分&#xff1a;ABP框架概述与核心架构1.1 ABP框架简介1.2 ABP框架架构解析1.2.1 表现层(Presentation Layer)1.2.2 分布式服务层(Distributed Service Layer)1.2.3 应用层(Application Layer)1.2.4 领域层(Domain Layer)1.2.5 基础设施层(Infrastructure Layer)…

力扣-198.打家劫舍

题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋…

windows 安装vllm cuda版本

windows 安装cuda版本 查看window cuda版本 nvidia-smi vllm 获取镜像,此版本需要cuda 版本12.8 或以上 docker pull vllm/vllm-openai:latest下载模型 git lfs installcd e:\ai mkdir vllm\models\qwen2cd vllm\models#通过git下载git clone https://www.modelscope.c…

Node.js特训专栏-基础篇:1. Node.js环境搭建与项目初始化详细指南

我将为你详细讲解 Node.js 环境搭建与项目初始化的步骤&#xff0c;包含常见问题解决和最佳实践&#xff0c;帮助你快速上手。 详细步骤说明 1. 环境搭建 Windows用户&#xff1a; 访问Node.js官网(https://nodejs.org)下载LTS版本安装包&#xff08;推荐长期支持版&#xf…

13.安卓逆向2-frida hook技术-HookJava构造方法

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…