`
顽石
  • 浏览: 166848 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

restful api的一些深层感悟

 
阅读更多

   restful风格的api相当流行了,但很多开发人员对restful并没有深入理解,这几年面试了很多人,对restful的理解都很肤浅,好一点的也只知道统一资源接口,很多连表示层状态转移的涵义到底是什么,‘’转移‘’到底是什么意思都不知道。

 

 相比远程过程调用(动词),restful的核心概念是资源(名词),大致可以对应领域驱动设计或领域模型中的领域实体,每个资源都有uri来标识。

 

    restful介绍或restful api设计最佳实践网上资料已经很多了,例如什么是状态转移、uri中不要用动词或也不要带.do.action等后缀、uri的可读性&层次性、http方法的幂等和安全等。

 

  这里只提一些容易误解或不容易想明白的地方。

     1)资源必须要有uri来标识,但一个资源可以有多个uri,它们都标识同一个资源。这个好理解,例如一个小朋友(资源),父母可以叫他小宝,也可叫他真实的名字,派出所还可以用他身份证号码来标识他。

     2)运用restful风格来设计api,要有资源意识,要有名词意识。例如登录和注销(退出登录),它们是动词,显然不能直接映射到restful api的资源中,这是要想到这些动词关联的名词,我们可以想到对应的名词:会话(session)。put一个会话资源就是登录,delete一个会话就是注销。

    3)实体或资源之间也存在聚合和包含关系,一对一、一对多、多对多关系。例如一个男人和女人结婚,这两个人存在婚姻关系。在restful中如何处理关系?restful风格中的核心概念是资源,既然要管理关系,那就要将关系作为一种资源,创建这种关系资源就建立了需要的关系,delete这个资源就是解除婚姻关系(离婚),所以婚姻关系也是种资源,也可用uri来标识它。至于婚姻关系是否是个核心概念,要看具体的应用,如果是在婚姻登记所的应用中,那婚姻关系肯定是核心,在一个个人档案管理系统中,可能并不关注婚姻关系,只是要在档案中填入配偶信息,那婚姻关系在这个应用的领域模型中就不需要存在。

    4http putpost的区别。putpost都可用来创建资源,此外put还可以更新资源。在创建资源时,putpost的区别是什么?put是创建一个具体的已知的资源,通常在uri中会包含有该资源的idputuri就是该资源的uri,也就是说客户端在创建资源时,客户端是知道该资源的uri的;而post是在资源集合(资源集合也是一种资源)中创建集合的一个成员(资源),posturi是资源集合,客户端此时不知道该资源的uri,只知道资源集合的uri

  例如植树节在树林里植树,你拿着一棵树想亲自植树,此时可以用put  /woods/{这颗树的id或唯一标识}来将这颗树种在树林里,例如put  /woods/1 (省略http body),意思是栽颗id1的树。你发多次put /woods/1请求种的是同一颗树(同一个资源),因此put是幂等的。如果是委托别人帮你种,你发出种树指令时不知道是种的那颗,此时用post  /woods,意思是种棵树,在post的响应中会返回所种树的id或url(url中包含id)。发送多次post  /woods请求,会种多棵树(不同的资源),因此post不是幂等的。当然你设计restful api时不遵守这些也是可以的,很多人的api中就用post(可能浏览器不支持PUT也是原因之一,但api一般是给后台系统调用),不用put,只要保证业务上不出错就行,例如业务上不重复。

 5)对查询,除了可以将查询条件放在GET请求问号后的查询字符串中,对复杂查询或长度大的查询条件,还可以将查询条件放在GET或POST的http body中,Elasticsearch就是将查询条件放在GET或POST方法的body中。

 6)restful风格不是银弹,不要手里拿着把锤子,看什么都像是钉子。

 

 

分享到:
评论

相关推荐

    Python Flask高级编程之RESTFul API前后端分离精讲第七章节

    Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API前后端分离精讲第六章节Python Flask高级编程之RESTFul API...

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验 本实验的主要目标是使用SpringBoot、Mybatis和CXF框架来实现Restful API和WebService API接口的大实验。下面是实验的详细介绍: 标题...

    k8s restful api 访问

    restful api访问k8s集群,增删改查信息。 需要预先创建访问权限的配置。 官网api文档 https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/ 下面罗列部分api curl -u admin:admin ...

    Python Flask高级编程之RESTFul API前后端分离精讲第一讲解

    Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask高级编程之RESTFul API前后端分离精讲Python Flask...

    thinkphp6 RESTful API开发

    thinkphp6 RESTful API开发 开发过程记录笔记 https://blog.csdn.net/weixin_41120504/article/details/115638094

    Python Flask高级编程之RESTFul API前后端分离精讲第二章节

    Python Flask高级编程之RESTFul API前后端分离精讲第二章节Python Flask高级编程之RESTFul API前后端分离精讲第二章节Python Flask高级编程之RESTFul API前后端分离精讲第二章节Python Flask高级编程之RESTFul API...

    RESTFul API 接口说明

    ### RESTful API 接口说明 #### 一、RESTful API 概述 RESTful(Representational State Transfer)API 是一种构建网络应用和服务的标准方法,它遵循特定的约束条件和原则,利用HTTP协议来实现客户端与服务器之间...

    RESTful API设计规范

    ### RESTful API设计规范详解 #### 一、RESTful简介 RESTful是一种广泛应用于Web服务的设计风格,全称为Representational State Transfer(表述性状态转移)。它并非一项具体的技术标准,而是一系列设计原则和约束...

    c c++实现http服务 c c++开发restful api服务

    本文将深入探讨如何使用C和C++来实现HTTP服务,并开发RESTful API服务器。 首先,HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本到本地浏览器。它是一个基于请求与...

    RestfulApi服务端.zip

    本项目提供了一个RestfulApi服务端的示例,帮助开发者了解如何构建这样的服务。 在RestfulApi服务端的实现中,通常会用到以下技术栈: 1. **服务器框架**:如Spring Boot或Express.js,它们为快速构建RESTful API...

    RestFul API 案例

    **RestFul API 知识点详解** REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,以数据为中心,强调资源的状态转移。RESTful API是遵循REST原则设计的Web服务接口,...

    Python语言开发RESTful API指南

    在当今信息技术飞速发展的时代,RESTful API已经成为构建互联网应用的基础。RESTful API提供了一种简单、高效、与语言无关的方法来构建Web服务。Python作为一种广泛使用的高级编程语言,以其简洁明了的语法、丰富的...

    Spring boot restful api demo

    **Spring Boot RESTful API Demo** 在现代Web开发中,RESTful API已经成为构建可扩展、松耦合服务的主要方式。Spring Boot作为Java生态系统中的一个强大框架,简化了创建生产级的基于Spring的应用程序。本示例将...

    浅谈java调用Restful API接口的方式

    "Java调用Restful API接口的方式" Java调用Restful API接口是Java开发中非常重要的一部分,了解Java调用Restful API接口的方式可以帮助开发者更好地理解和使用相关技术。本文将详细介绍Java调用Restful API接口的...

    OPCDA转restfulAPI,opcDA与mes或其它第三方通讯服务

    OPCDA转restfulAPI,opcDA与mes或其它第三方通讯服务 x86

    RESTFUL API设置最佳实

    ### RESTful API 设计最佳实践 #### 一、引言 随着互联网技术的发展,Web 应用变得越来越复杂,为了支持这些应用的功能扩展和服务交互,API 的设计变得尤为重要。RESTful API 是一种基于 HTTP 协议的应用程序编程...

    Spring Boot + Mybatis 整合实现RESTful API

    Spring Boot 整合 Mybatis 实现RESTful API ,具体可以查看博客: http://blog.csdn.net/yaozhiqi1905658804/article/details/70820892

    lighttpd restfulapi cgi

    【标题】"lighttpd RESTful API与CGI的整合" 在Web开发中,轻量级HTTP服务器(如lighttpd)因其高效、低资源占用而受到青睐,尤其适合小型和中型项目。RESTful API设计模式是现代Web服务的重要组成部分,它允许通过...

    Laravel开发-restfulapi

    "Laravel开发-restfulapi"的主题着重于使用Laravel框架创建RESTful API。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,以资源为中心,通过统一的接口进行交互。 ...

Global site tag (gtag.js) - Google Analytics