首页
技术笔记
网址导航
Json在线解析
二维码
Ip地址查询
在线流程图
新用户注册
|
会员登录
在线工具
开发笔记
毒鸡汤
网址导航
免费在线流程图
4赞
563
当前位置:
开发笔记
>
编程语言
> 正文
求解惑如何设计RESTFUL服务?
作者:小白也坚强_177 | 2021-09-08 09:20
回复内容:楼主应该对REST有基本了解,所以基本概念我就不再重复,只说一下楼主比较糊涂的点资源并不是对底层存储对象或者程序Model的直接映射并不是说你有User表和Role表,就一定要设计对应的资源。实际上RESTful资源和底层存储服务之间的关系类似于关系式数据库内的表和视图的关系,视图是根据实
回复内容:
楼主应该对REST有基本了解,所以基本概念我就不再重复,只说一下楼主比较糊涂的点
资源并不是对底层存储对象或者程序Model的直接映射
并不是说你有User表和Role表,就一定要设计对应的资源。
实际上RESTful资源和底层存储服务之间的关系类似于关系式数据库内的表和视图的关系,视图是根据实际查询需要组合多个表形成的关系集合。
无论你的存储服务到底是关系式数据库还是NoSQL数据库甚至文本文件,对于访问资源的客户端来说都是一样的。
所以创建一个用户,同时设置其角色,完全可以用POST /user直接完成
// 创建具有foo和bar两个角色的新用户
POST /user
{name: (string), passwd: (string), roles: ['foo', 'bar']}
// 如果response header能够包含以下两条最好
// 以201状态响应,用Location告知新资源url
HTTP/1.1 201 Created
Location: /user/1
---------------------------------------------------------
// 修改用户的角色为foobar
PUT /user/1
{roles: ['foobar']}
---------------------------------------------------------
// 修改用户的密码
PUT /user/1
{passwd: (string)}
至于/UserRoleRelation这样粒度比较小的资源,我建议先不要,资源的粒度应该是先粗后细,根据业务后续的演化和实际需要再考虑是否抽象更细粒度的资源,一开始就搞得太细的话,任何一次操作都会被分解为多次网络IO,且系统复杂度容易搞得比较高。
把具体的数据库表映射为资源,然后把CRUD动作对应到GET/POST/PUT/DELETE上,既傻又不安全,本来这些东西都是为业务服务,因为业务需求而存在的,结果抽象时却不围绕业务设计,这是本末倒置。
正确的思路应该是,忘记什么数据库和程序Model,只从HTTP的角度考虑,根据业务,需要设计哪些资源(url),GET/POST时接受和响应哪些参数,把这些敲定之后,再从数据库和程序Model上去考虑如何配合。 Lynda上有视频教程,教你怎么设计restful api,还是不错的
Effective Design of RESTful APIs
从现在已有的框架来看,对资源的操作一般都是映射到对象方法上的。对资源的设计是粗粒度的,而不是从底层数据库出发来设计资源。用成熟的框架来完成RESTful设计,一般还是资源-对象-关系数据库,之间包含了两层映射。 楼上说的在理,RESTFUL 系统设计应该从业务出发,而不应该从底层数据库出发。
先构思你系统当中业务范畴与功能 ,然后在将数据库CRUD归入业务操作,考虑数据库如何去配合业务流程。
推荐阅读
程序员
针对Firefox-to-Chrome和Chrome-to-Firefox的WebRTC视频聊天无效
如何解决《针对Firefox-to-Chrome和Chrome-to-Firefox的WebRTC视频聊天无效》经验,为你挑选了0个好方法。 ...
[详细]
程序员
如何在uwp上模糊网格背景?
如何解决《如何在uwp上模糊网格背景?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
查找文件的父ID:Google Drive API V3
如何解决《查找文件的父ID:GoogleDriveAPIV3》经验,为你挑选了2个好方法。 ...
[详细]
程序员
通过读取Python的dask模块中的pickle文件来创建dask数据帧
如何解决《通过读取Python的dask模块中的pickle文件来创建dask数据帧》经验,为你挑选了1个好方法。 ...
[详细]
程序员
将Hex字符串转换为Int时的java.lang.NumberFormatException
如何解决《将Hex字符串转换为Int时的java.lang.NumberFormatException》经验,为你挑选了1个好方法。 ...
[详细]
程序员
管道多部分表单上传到另一台服务器
如何解决《管道多部分表单上传到另一台服务器》经验,为你挑选了0个好方法。 ...
[详细]
程序员
在设置Android应用程序的区域设置后,SharedPrefs正在重置
如何解决《在设置Android应用程序的区域设置后,SharedPrefs正在重置》经验,为你挑选了0个好方法。 ...
[详细]
程序员
如何将输出变为连续字符串而不是将其堆叠在每个字母的顶部 - c#
如何解决《如何将输出变为连续字符串而不是将其堆叠在每个字母的顶部-c#》经验,为你挑选了1个好方法。 ...
[详细]
程序员
如何将数组拆分成组
如何解决《如何将数组拆分成组》经验,为你挑选了0个好方法。 ...
[详细]
程序员
Worksheet_change:删除整列值,在此操作之前标识非空单元格
如何解决《Worksheet_change:删除整列值,在此操作之前标识非空单元格》经验,为你挑选了0个好方法。 ...
[详细]
程序员
从数据透视表中查找一行
如何解决《从数据透视表中查找一行》经验,为你挑选了0个好方法。 ...
[详细]
程序员
每次在ng-repeat上添加一个内联值
如何解决《每次在ng-repeat上添加一个内联值》经验,为你挑选了1个好方法。 ...
[详细]
程序员
我的wp-admin并没有工作
如何解决《我的wp-admin并没有工作》经验,为你挑选了0个好方法。 ...
[详细]
程序员
如何使用boost :: variant以"二维方式"定义异构std :: map
如何解决《如何使用boost::variant以"二维方式"定义异构std::map》经验,为你挑选了0个好方法。 ...
[详细]
程序员
Oracle Apex:PL/SQL块中的Javascript代码
如何解决《OracleApex:PL/SQL块中的Javascript代码》经验,为你挑选了0个好方法。 ...
[详细]
程序员
在支持设计库中找不到android.support.design.widget.Snackbar
如何解决《在支持设计库中找不到android.support.design.widget.Snackbar》经验,为你挑选了3个好方法。 ...
[详细]
程序员
在Rstudio中运行python/bash代码
如何解决《在Rstudio中运行python/bash代码》经验,为你挑选了0个好方法。 ...
[详细]
程序员
MPAndroidChart未更新
如何解决《MPAndroidChart未更新》经验,为你挑选了1个好方法。 ...
[详细]
程序员
为什么Scala不允许在不使用"new"运算符的情况下实例化类?
如何解决《为什么Scala不允许在不使用"new"运算符的情况下实例化类?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
确定Java注释处理器中类型的稳定性
如何解决《确定Java注释处理器中类型的稳定性》经验,为你挑选了0个好方法。 ...
[详细]
吐了个 "CAO" !
吐个槽吧,看都看了
会员登录
|
用户注册
小白也坚强_177
这个屌丝很懒,什么也没留下!
关注作者
Tags | 热门标签
actionscrip
bash
c#
c++
c语言
erlang
flutter
go
golang
java
javascript
lua
node.js
perl
php
python
scala
typescript
RankList | 热门文章
1
使用Python的Windows桌面GUI自动化 - 睡眠与紧密循环
2
使用Google Maps API旋转SVG符号以匹配飞机航向
3
使用值而不是索引从Python列表中进行选择
4
MATLAB中阈值内的最小二乘最小化
5
System.out.println在Play Framework控制台中按顺序打印
6
根据foldr验证foldl实现
7
Outlook关闭时,为什么Excel VBA运行速度明显加快?
8
如何在Javascript中将UTC/GMT日期时间转换为CST?(不是本地的,CST总是)
9
为什么LocationSettingsResult startResolutionForResult没有调用onActivityResult?
10
保存录制的音频(Swift)
11
AWS Lambda通过cloudformation安排事件源
12
[iOS]:检测视图控制器何时从另一个外部应用程序返回后出现
13
如何使用jquery或javascript从html表中删除文本框而不会丢失文本框值
14
for stylus for CSS选择器名称的循环
15
如何使用控制台在React Native Android中调试Java代码
16
打印单击按钮的文本tkinter
17
如何正确编写递归jquery承诺的代码
18
样式本机JavaScript通知
19
具有外部身份验证的AWS API Gateway
20
如何明确地广播张量以匹配张量流中的另一个形状?
DevBox开发工具箱 | 专业的在线开发工具网站
京公网安备 11010802040832号
|
京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有