<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Api设计规范 on 学无止境</title>
		<link>https://sunnnnner.github.io/tags/api%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83/</link>
		<description>Recent content in Api设计规范 on 学无止境</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Fri, 06 Sep 2019 11:36:12 +0800</lastBuildDate>
		
			<atom:link href="https://sunnnnner.github.io/tags/api%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>RESTful API 设计指南</title>
				<link>https://sunnnnner.github.io/posts/restful/restful%E8%A7%84%E8%8C%83/</link>
				<pubDate>Fri, 06 Sep 2019 11:36:12 +0800</pubDate>
				<guid>https://sunnnnner.github.io/posts/restful/restful%E8%A7%84%E8%8C%83/</guid>
				<description>&lt;h2 id=&#34;1-什么是restful&#34;&gt;1. 什么是RESTful&lt;/h2&gt;&#xA;&lt;p&gt;RESTful是一种软件架构风格，主要用于规范客户端与服务端的交互。它不是标准，而是一套设计原则和约束条件，帮助我们创建更优雅的API接口。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-核心原则&#34;&gt;2. 核心原则&lt;/h2&gt;&#xA;&lt;h3 id=&#34;21-面向资源&#34;&gt;2.1 面向资源&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用名词表示资源&lt;/li&gt;&#xA;&lt;li&gt;URL中避免使用动词&lt;/li&gt;&#xA;&lt;li&gt;资源应该是名词的复数形式&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# 好的例子&#xA;GET /api/v1/users          # 获取用户列表&#xA;GET /api/v1/users/123      # 获取特定用户&#xA;POST /api/v1/users         # 创建用户&#xA;&#xA;# 不好的例子&#xA;GET /api/v1/getUsers&#xA;POST /api/v1/createUser&#xA;PUT /api/v1/updateUser&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;22-http方法&#34;&gt;2.2 HTTP方法&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;方法&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;用途&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;特点&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;GET&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;获取资源&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;安全且幂等&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;POST&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;创建资源&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;非幂等&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;PUT&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;更新资源（完整）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;幂等&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;DELETE&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;删除资源&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;幂等&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;PATCH&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;更新资源（部分）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;幂等&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;3-设计规范&#34;&gt;3. 设计规范&lt;/h2&gt;&#xA;&lt;h3 id=&#34;31-url设计&#34;&gt;3.1 URL设计&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# 版本号&#xA;/api/v1/resources&#xA;&#xA;# 资源层级&#xA;/api/v1/users/{user_id}/orders/{order_id}&#xA;&#xA;# 过滤、排序、分页&#xA;/api/v1/users?page=2&amp;amp;size=10&#xA;/api/v1/products?sort=price_desc&#xA;/api/v1/orders?status=pending&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;32-安全性&#34;&gt;3.2 安全性&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用HTTPS协议&lt;/li&gt;&#xA;&lt;li&gt;实现身份认证&lt;/li&gt;&#xA;&lt;li&gt;使用OAuth2等授权机制&lt;/li&gt;&#xA;&lt;li&gt;实施速率限制&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;33-状态码使用&#34;&gt;3.3 状态码使用&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# 常用状态码&#xA;200 OK              # 请求成功&#xA;201 Created         # 创建成功&#xA;204 No Content      # 删除成功&#xA;400 Bad Request     # 请求错误&#xA;401 Unauthorized    # 未授权&#xA;403 Forbidden       # 禁止访问&#xA;404 Not Found       # 资源不存在&#xA;500 Server Error    # 服务器错误&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;34-响应格式&#34;&gt;3.4 响应格式&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# 成功响应&#xA;{&#xA;    &amp;#34;status&amp;#34;: &amp;#34;success&amp;#34;,&#xA;    &amp;#34;data&amp;#34;: {&#xA;        &amp;#34;id&amp;#34;: 1,&#xA;        &amp;#34;name&amp;#34;: &amp;#34;John Doe&amp;#34;,&#xA;        &amp;#34;email&amp;#34;: &amp;#34;john@example.com&amp;#34;&#xA;    },&#xA;    &amp;#34;links&amp;#34;: {&#xA;        &amp;#34;self&amp;#34;: &amp;#34;/api/v1/users/1&amp;#34;,&#xA;        &amp;#34;orders&amp;#34;: &amp;#34;/api/v1/users/1/orders&amp;#34;&#xA;    }&#xA;}&#xA;&#xA;# 错误响应&#xA;{&#xA;    &amp;#34;status&amp;#34;: &amp;#34;error&amp;#34;,&#xA;    &amp;#34;code&amp;#34;: &amp;#34;USER_NOT_FOUND&amp;#34;,&#xA;    &amp;#34;message&amp;#34;: &amp;#34;User with id 1 not found&amp;#34;,&#xA;    &amp;#34;documentation_url&amp;#34;: &amp;#34;/api/docs#errors&amp;#34;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;4-最佳实践&#34;&gt;4. 最佳实践&lt;/h2&gt;&#xA;&lt;h3 id=&#34;41-版本控制&#34;&gt;4.1 版本控制&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# URL中的版本号&#xA;/api/v1/users&#xA;&#xA;# Header中的版本号&#xA;Accept: application/vnd.company.api+json;version=1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;42-hateoas&#34;&gt;4.2 HATEOAS&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;{&#xA;    &amp;#34;data&amp;#34;: {&#xA;        &amp;#34;id&amp;#34;: 123,&#xA;        &amp;#34;status&amp;#34;: &amp;#34;pending&amp;#34;&#xA;    },&#xA;    &amp;#34;_links&amp;#34;: {&#xA;        &amp;#34;self&amp;#34;: &amp;#34;/api/v1/orders/123&amp;#34;,&#xA;        &amp;#34;cancel&amp;#34;: &amp;#34;/api/v1/orders/123/cancel&amp;#34;,&#xA;        &amp;#34;payment&amp;#34;: &amp;#34;/api/v1/orders/123/payment&amp;#34;&#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;43-查询参数规范&#34;&gt;4.3 查询参数规范&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# 分页&#xA;/api/v1/users?page=2&amp;amp;per_page=100&#xA;&#xA;# 过滤&#xA;/api/v1/users?status=active&amp;amp;role=admin&#xA;&#xA;# 排序&#xA;/api/v1/users?sort=created_at:desc&#xA;&#xA;# 字段选择&#xA;/api/v1/users?fields=id,name,email&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;5-文档和测试&#34;&gt;5. 文档和测试&lt;/h2&gt;&#xA;&lt;h3 id=&#34;51-api文档&#34;&gt;5.1 API文档&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用OpenAPI/Swagger&lt;/li&gt;&#xA;&lt;li&gt;提供详细的参数说明&lt;/li&gt;&#xA;&lt;li&gt;包含请求和响应示例&lt;/li&gt;&#xA;&lt;li&gt;说明错误处理机制&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;52-测试建议&#34;&gt;5.2 测试建议&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;编写完整的单元测试&lt;/li&gt;&#xA;&lt;li&gt;进行集成测试&lt;/li&gt;&#xA;&lt;li&gt;性能测试&lt;/li&gt;&#xA;&lt;li&gt;安全性测试&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;6-注意事项&#34;&gt;6. 注意事项&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;保持API的简单性和一致性&lt;/li&gt;&#xA;&lt;li&gt;正确处理错误情况&lt;/li&gt;&#xA;&lt;li&gt;实现适当的缓存机制&lt;/li&gt;&#xA;&lt;li&gt;考虑向后兼容性&lt;/li&gt;&#xA;&lt;li&gt;提供充分的文档说明&lt;/li&gt;&#xA;&lt;li&gt;实现合适的监控机制&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
	</channel>
</rss>
