目录

Restful API

1. 什么是 API

2. REST 简介

3.RESTful RUI的设计

4. RPC 简介

API 流程

1. HTTP API 服务器启动流程

2. HTTP 请求处理流程

3. HTTP 请求和响应格式介绍

项目目录结构


Restful API

了解什么是API和REST
掌握RESTful api设计原则
了解RPC

1. 什么是 API

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数或者接口,目的是提供应用 程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无须访问源码,或理解内部工作机制的细节。
要实现一个 API 服务器,首先要考虑两个方面: API 风格和媒体类型 。
Go 语言中常用的 API 风格是 RPC 和 REST,常用的媒体类型是 JSON、XML 和 Protobuf。
在 Go API 开发中常用的组合是 gRPC + Protobuf 和 REST + JSON 。

2. REST 简介

REST 代表表现层状态转移(REpresentational State Transfer),由 Roy Fielding 在他的论文中提出。REST 是一 种软件架构风格,不是技术框架,REST 有一系列规范,满足这些规范的 API均可称为 RESTful API。REST 规范中有 如下几个核心:
1. REST 中一切实体都被抽象成资源,每个资源有一个唯一的标识 —— URI,所有的行为都应该是在资源上的
CRUD 操作
2. 使用标准的方法(GET/POST/PUT/DELETE)来更改资源的状态,常见的操作有:资源的增删改查操作
3. 无状态:这里的无状态是指每个 RESTful API 请求都包含了所有足够完成本次操作的信息,服务器端无须保持
Session
无状态对于服务端的弹性扩容是很重要的。
REST 风格虽然适用于很多传输协议,但在实际开发中,REST 由于天生和 HTTP 协议相辅相成,因此 HTTP 协议已经
成了实现 RESTful API 事实上的标准。在 HTTP 协议中通过 POST、DELETE、PUT、GET 方法来对应 REST 资源的
增、删、改、查操作,具体的对应关系如下:
HTTP方法 行为 URl 示例说明
GET 获取资源列表
/users
获取账号列表
GET 获取一个具体的资源
/users/admin
获取admin账号的详细信息
POST 创建一个新的资源
/users
创建一个新账号
PUT 以整体的方式更新一个资源
/users/1
更新id为1的账号
DELETE 删除服务器上的一个资源
/users/1
删除id为1的账号

3.RESTful RUI的设计

域名
应该尽量将API部署在专用域名之下。
https://api.example.com
如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。
https://example.org/api/
版本(Versioning
方法一:应该将API的版本号放入URL。
http://www.example.com/app/1.0/foo
http://www.example.com/app/1.1/foo
http://www.example.com/app/2.0/foo方法二:将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。
因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URL。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见Versioning REST Services):
Accept: vnd.example-com.foo+json; version=1.0
Accept: vnd.example-com.foo+json; version=1.1
Accept: vnd.example-com.foo+json; version=2.0
路径(Endpoint
路径又称"终点"(endpoint),表示API的具体网址,每个网址代表一种资源(resource)
名词vs动词
资源作为网址,只能有 名词 ,不能有 动词 ,而且所用的名词往往与数据库的表名对应。举例来说:
# 获取所有端口
/getProducts
# 获取所有订单
/listOrders
# 订单1的所有回复(排序返回)
/retreiveClientByOrder?orderId=1对于一个简洁结构,你应该始终用名词。 此外,利用的HTTP方法可以分离网址中的资源名称的操作。
# 获取所有产品清单
GET /products
# 新建产品
POST /products
# 获取产品4的信息
GET /products/4
# 更新产品4的信息
PATCH(或)PUT /products/4
使用复数
API中的名词应该使用复数。无论子资源或者所有资源。 举例来说,获取产品的API可以这样定义
# 获取单个产品
http://127.0.0.1:8080/AppName/rest/products/1
# 获取所有产品
http://127.0.0.1:8080/AppName/rest/products
HTTP动词
对于资源的具体操作类型,由HTTP动词表示。 常用的HTTP动词有下面四个(括号里是对应的SQL命令)。
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
DELETE(DELETE):从服务器删除资源。还有三个不常用的HTTP动词
PATCH(UPDATE):在服务器更新(更新)资源(客户端提供改变的属性)。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
过滤信息(Filtering
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。下面是一些常见的参 数。
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoos/ID/animals 与 GET /animals? zoo_id=ID 的含义是相同的。
状态码(Status Codes
服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。
200 OK - [GET]:服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
返回结果及错误处理(Error handling
服务器返回的数据格式,应该尽量使用JSON,避免使用XML
定制标准化的返回结果
{ "code": 10002, "message": "Error occurred while binding the request body to the struct." "data":{}
}
如果请求出错服务器就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键
值即可。
{ "code": 10002, "error": "Error occurred while binding the request body to the struct." }

4. RPC 简介

根据维基百科的定义:远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于 一台计算机的程序调用另一台计算机的子程序,而程序员无须额外地为这个交互作用编程。
通俗来讲,就是服务端实现了一个函数,客户端使用 RPC 框架提供的接口,调用这个函数的实现,并获取返回值。 RPC 屏蔽了底层的网络通信细节,使得开发人员无须关注网络编程的细节,而将更多的时间和精力放在业务逻辑本身 的实现上,从而提高开发效率。
RPC 的调用过程如下(图片来自 How RPC Works):
1. Client 通过本地调用,调用 Client Stub
2. Client Stub 将参数打包(也叫 Marshalling)成一个消息,然后发送这个消息
3. Client 所在的 OS 将消息发送给 Server
4. Server 端接收到消息后,将消息传递给 Server Stub
5. Server Stub 将消息解包(也叫 Unmarshalling)得到参数
6. Server Stub 调用服务端的子程序(函数),处理完后,将最终结果按照相反的步骤返回给 Client

API 流程

1. HTTP API 服务器启动流程

1. 在启动一个 API 命令后,API 命令会首先加载配置文件,根据配置做后面的处理工作。            2. 通常会将日志相关的配置记录在配置文件中,在解析完配置文件后,就可以加载日志包初始化函数,来初始化 日志实例,供后面的程序调用。                                                                                  3. 接下来,初始化数据库实例,建立数据库连接,供后面对数据库的 CRUD 操作使用。                4. 在建立完数据库连接后,需要设置 HTTP,通常包括 3 方面的设置:                                                    设置 Header                                                                                                                                        注册路由                                                                                                                                            注册中间件                                                                                                                               5. 之后会调用 net/http 包的 ListenAndServe() 方法启动 HTTP 服务器。                                          6. 在启动 HTTP 端口之前,程序会 go 一个协程,来ping HTTP 服务器的 /sd/health 接口,如果程序成功启动,ping 协程在timeout 之前会成功返回,如果程序启动失败,则 ping协程最timeout,并终止整个程序

2. HTTP 请求处理流程

1. 建立连接

客户端发送 HTTP 请求后,服务器会根据域名进行域名解析,就是将网站名称转变成 IP 地址:localhost -> 127.0.0.1,Linux hosts文件、DNS 域名解析等可以实现这种功能。之后通过发起 TCP 的三次握手建立连接。TCP 三 次连接请参考 TCP 三次握手详解及释放连接过程,建立连接之后就可以发送 HTTP 请求了。

2. 接收请求

HTTP 服务器软件进程,这里指的是 API 服务器,在接收到请求之后,首先根据 HTTP 请求行的信息来解析到 HTTP 方法和路径,在上图所示的报文中,方法是 GET ,路径是 /index.html ,之后根据 API 服务器注册的路由信息(大 概可以理解为:HTTP 方法 + 路径和具体处理函数的映射)找到具体的处理函数。

3. 处理请求

在接收到请求之后,API 通常会解析 HTTP 请求报文获取请求头和消息体,然后根据这些信息进行相应的业务处理,HTTP 框架一般都有自带的解析函数,只需要输入 HTTP 请求报文,就可以解析到需要的请求头和消息体。通常情况下,业务逻辑处理可以分为两种:包含对数据库的操作和不包含对数据的操作。大型系统中通常两种都会有:
        1. 包含对数据库的操作:需要访问数据库(增删改查),然后获取指定的数据,对数据处理后构建指定的响应结构体,返回响应包。数据库通常用的是 MySQL,因为免费,功能和性能也都能满足企业级应用的要求。
        2. 不包含对数据库的操作:进行业务逻辑处理后,构建指定的响应结构体,返回响应包。

4. 记录事务处理过程

在业务逻辑处理过程中,需要记录一些关键信息,方便后期 Debug 用。在 Go 中有各种各样的日志包可以用来记录这些信息。

3. HTTP 请求和响应格式介绍

请求头的组成

1. 第一行必须是一个请求行(request line)
        用来说明请求类型、要访问的资源以及所使用的 HTTP 版本
2. 紧接着是一个头部(header)小节
        用来说明服务器要使用的附加信息
3. 之后是一个空行
4. 最后是请求数据(称之为主体:body)
        可以添加任意的其他数据
任意请求一个网站,使用F12可查看到请求头和响应头信息
HTTP 响应格式跟请求格式类似,也是由 4 个部分组成:状态行、消息报头、空行和响应数据。

项目目录结构

在Go API 项目中,一般都会包括很多功能。如这些功能项:Makefifile 文件(编译文件)、配置文件目录、RESTful API 服务器的 handler 目录、model 目录、工具类目录、vendor 目录,以及实际处理业务逻辑函数所存放的service 目录。
这些都在上述的代码结构中有列出,新加功能时将代码放入对应功能的目录/文件中,可以使整个项目代码结构更加清晰,非常 有利于后期的查找和维护

GO语言03(Restful API,API流程以及代码结构)相关推荐

  1. 【Go API 开发实战 3】API 流程和代码结构

    API 流程和代码结构 为了使读者在开始实战之前对 API 开发有个整体的了解,这里选择了两个流程来介绍: HTTP API 服务器启动流程 HTTP 请求处理流程 本小节也提前给出了程序代码结构图, ...

  2. MATLAB仿真作图的流程与代码结构-经验总结

    文章目录 流程简述 代码结构 1.第一部分:加载数据 2.第二部分:仿真计算 3.第三部分:绘图 命名规则 流程简述 在长期编写matlab代码中总结出得经验:通过一个合理的流程来写MATLAB代码, ...

  3. 非顺序控制结构的c语言语法是怎样的,流程控制语句:顺序结构和选择结构

    流程控制语句 概述:控制程序的执行流程 分类: 顺序结构 选择结构 循环结构 顺序结构语句 顺序结构语句:从上往下,依次执行 选择结构 if语句: switch语句: if语句: 格式1: 格式2: ...

  4. API流程和代码结构

    一.HTTP API 服务器启动流程 1. 在启动一个 API 命令后,API 命令会首先加载配置文件,根据配置做后面的处理工作. 2. 通常会将日志相关的配置记录在配置文件中,在解析完配置文件后,就 ...

  5. SpringBoot RESTful 风格 API 多语言国际化i18n解决方案

    文章目录 1 摘要 2 核心代码 2.1 多语言枚举类 2.2 多语言处理工具类 2.3 多语言的API返回状态码枚举类 2.4 多语言 API 接口返回结果封装 2.5 i18n 国际化多语言配置文 ...

  6. 学习笔记-Spring Boot 开发 RESTful Web API(一)

    题记: 本篇是Spring Boot 开发学习系列中基础知识学习的一部分,为 RESTful Web API 相关基础知识,为实践操作奠定理论基础. REST不是一个标准,而是一种软件应用架构风格.基 ...

  7. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

  8. django restful 请求_利用 Django REST framework 构建 RESTful Web API

    利用 Django REST framework 构建 RESTful Web API 终于到了动手操作的环节啦,这一节,我们以师生管理系统为例,带领大家搭建一套 framework Web API. ...

  9. 对RESTful Web API的理解与设计思路

    距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很 ...

最新文章

  1. 14.关于原子性的相关介绍
  2. dubbo相关的知识点总结
  3. python中的os abort_Python os.abort()用法及代码示例
  4. java jtable行标题_如何设置JTable的标题——如图
  5. 华为手机助手解析包时出现问题_iOS12.0-12.1.2设备降级/平刷iOS12.0-12.1.2教程(付问题解决)...
  6. 日常生活小技巧 -- UltraEdit复制16进制数据
  7. push failed in WebIDE
  8. debian执行php网页,如何在Debian上安装和使用PHP Composer
  9. 那些有趣的电子漫画合集
  10. B树、B+树到底是什么?
  11. CraftAR入门教程
  12. 暗黑破坏神java魔法护身,发个实用的贴!!暗黑+1+2技能护身符合成,望大家顶下,能加精...
  13. 【超参数寻优】粒子群算法(PSO) 超参数寻优的python实现
  14. iphone-common-codes-ccteam源代码 CCCommon.h
  15. 原子操作--sync/atomic的用法
  16. 关关采集V3.5高级版杰奇全版本通用编码版
  17. 超简洁又强大的幻灯片JS、CSS代码,兼容性强
  18. 几何分布(一种离散分布)
  19. chm文件打不开,已取消到该网页的导航
  20. MTF 曲线图应该怎么看?

热门文章

  1. 贴片轻触开关路线难题
  2. 彻底禁用Chrome的“请停用以开发者模式运行的扩展程序”弹窗
  3. 世界公认最健康的作息时间表,今后就照这个来~
  4. [源码和文档分享]C++实现的基于NSM的简易数据库
  5. 网络安全工具 Godzilla 哥斯拉内存马使用
  6. 【2021年我在CSDN干了啥 -- 一名博客专家的自述】
  7. EWT/经验小波变换/EWT安装包下载
  8. 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》
  9. M1 docker 安装mysql5.7
  10. 【观察】重塑全国产化应用交付格局,神州数码自主创新更上层楼