REST - Representational State Transfer - 表述性状态转移 (资源在网络中以某种形式进行状态转移)
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。资源总要通过某种载体反应其内容,文本可以用txt格式表现,也可以用HTML格式、XML格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现;JSON是现在最常用的资源表示格式。
结合我的开发实践,我对资源和数据理解如下:
资源是以json(或其他Representation)为载体的、面向用户的一组数据集,资源对信息的表达倾向于概念模型中的数据,Represntation 是REST架构的表现层
RESTful架构风格规定,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,
分别对应于HTTP方法:
GET用来获取资源,
POST用来新建资源(也可以用于更新资源),
PUT用来更新资源,
DELETE用来删除资源,
这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。
可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。
一般的,每个资源至少有一个URI与之对应,最典型的URI即URL。
所谓无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。\
有状态和无状态的区别,举个简单的例子说明一下。如查询员工的工资,如果查询工资是需要登录系统,进入查询工资的页面,执行相关操作后,获取工资的多少,则这种情况是有状态的,因为查询工资的每一步操作都依赖于前一步操作,只要前置操作不成功,后续操作就无法执行;如果输入一个url即可得到指定员工的工资,则这种情况是无状态的,因为获取工资不依赖于其他资源或状态,且这种情况下,员工工资是一个资源,由一个url与之对应,可以通过HTTP中的GET方法得到资源,这是典型的RESTful风格。
由于RESTful风格的服务是无状态的,认证机制尤为重要。例如上文提到的员工工资,这应该是一个隐私资源,只有员工本人或其他少数有权限的人有资格看到,如果不通过权限认证机制对资源做一层限制,那么所有资源都以公开方式暴露出来,这是不合理的,也是很危险的。
认证机制解决的问题是,确定访问资源的用户是谁;权限机制解决的问题是,确定用户是否被许可使用、修改、删除或创建资源。权限机制通常与服务的业务逻辑绑定,因此权限机制需要在每个系统内部定制,而认证机制基本上是通用的,常用的认证机制包括 session auth(即通过用户名密码登录),basic auth,token auth和OAuth,服务开发中常用的认证机制为后三者。
- Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。因此,在开发对外开放的RESTful API时,尽量避免采用Basic Auth
- Token Auth并不常用,它与Basic Auth的区别是,不将用户名和密码发送给服务器做用户认证,而是向服务器发送一个事先在服务器端生成的token来做认证。因此Token Auth要求服务器端要具备一套完整的Token创建和管理机制,该机制的实现会增加大量且非必须的服务器端开发工作,也不见得这套机制足够安全和通用,因此Token Auth用的并不多。
- OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。正是由于OAUTH的严谨性和安全性,现在OAUTH已成为RESTful架构风格中最常用的认证机制,和RESTful架构风格一起,成为企业级服务的标配。目前OAuth已经从OAuth1.0发展到OAuth2.0,但这二者并非平滑过渡升级,OAuth2.0在保证安全性的前提下大大减少了客户端开发的复杂性,因此,建议在实战应用中采用OAuth2.0认证机制
一次请求和多次请求,资源的状态是一样。无论调用多少次都不会产生不同副作用(数据变更)
比如GET和HEAD ,不论你请求多少次,资源还是在那里
DELETE和PUT也是等幂的,因为对同一个资源删除一次或者多次,结果是一样的,就是资源被删除
GET: get用于获取资源,不管调用多少次接口,返回结果保持不变,不会改变资源
PUT: put用于更新资源,没有的话则执行创建操作
PUT /table/11 , 后台创建 /table/11 (帮我看下11号表在不在,在的话更新下状态,不在的话创建下)
PUT /table/11 , 后台更新 /table/11 (帮我看下11号表在不在,在的话更新下状态,不在的话创建下)
由于两次请求携带的数据是一样的,所以不论请求多少次,最终的结果都是后台存在这么一个资源(创建或更新)
DELETE: delete用于删除资源,会将资源从后台删除。如:
第一次调用 DELETE /table/11 , 后台删除 /table/11对应的数据信息 (11号表我不要了,帮我删除下吧)
第二次调用 DELETE /table/11 , 后台判断 /tickets/11不存在,无操作(11号表我不记得有没有删除,帮我删除下吧)
POST: post用于创建资源,每次调用都会创建一个新的资源
第一次调用 POST /table ,后台产生 /table/1 这么一个资源(我要新增一张表)
第二次调用 POST /table , 后台产生 /table/2 这么一个资源(我要再新增一张表)
所以设计Restful API的时候,GET,HEAD, PUT, DELETE一定要设计成幂等。
由于网络是不可靠的,安全性和幂等性就显得特别重要。如果一次请求,服务器收到处理以后,客户端没有收到相应,客户端会再次请求,如果没有等幂性保障,就会发生意想不到的问题
网上的大多数教程,都是教给你怎么使用VBA下载股票数据。但下载股票数据这种最基本操作,在Excel2010之后,已经可以通过内置的功能直接加载了。目前Excel获取股票数据的方式有四种方式,包括:从通达信等股票软件中直接获取交易数据使用一些财经网站上提供的CSV格式数据利用EXCEL的爬虫功能爬取网页上的股票数据利用网站的API接口获取数据等等其中API接口,最常用的公共接口有Y...
=================配置安装oracle环境过程中可能修改了root登录限制。==========找到的办法:远程登录的话查看下/etc/ssh/sshd_config找如下的一句 PermitRootLogin no 改为如下的; PermitRootLogin yes不行的话cat /etc/security看下有没这么一行:SU_ROOT
本栏按基础顺序,从零学起,手把手教你学java,详细讲述图解JavaSE的基础教程,附带了所有资料以及增值项目,您值得收藏!点击打开链接
第一步:创建swagger2要忽略的注解第二步:重写ModelAttributeParameterExpander修改了方法propertyDescriptors/** * @author ycx * @title: CustomizeModelAttributeParameterExpander * @description: TODO * @date 2020/3/2...
基于Android9.0 源码分析hw/[email protected]和audioserver进程类似,也是通过init进程加载rc文件的方式,启动servicerc配置文件:frameworks/av/services/mediacodec/[email protected] vendor.media.omx /vendor/bin/hw/android.hardware.media.omx@
一说到苹果为什么卖的比别人贵,很多人说因为品质好,不过,最近iPhone12新品却因为品质的问题翻了车。一起来看看究竟是怎么回事。 l 10月23日起,苹果官方Apple Store直营店内已经上新了iPhone 12、iPhone 12 Pro手机。l 10月25日,仅3天时间,就有人看到Apple Store中的部分iPhone 12 Pro手机已经被顾客抚摸到边框掉漆。 有网友曝出苹果线下体...
在word2vec中,为了简化训练的过程,经常会用到Negative Sampling负采样这个技巧,这个负采样到底是怎么样的呢?之前在我的博文 word2vec算法理解和数学推导 中对于word2vec有了很详细的数学推导,这里主要讲解一下负采样是如何降低word2vec的复杂度的。首先我们直接写出word2vec的目标函数,假设有一句话:query=w1,w2,w3,..,wnquery =...
<br />代理发布那一段我就不贴出来了 ,这天气冷得要命,需要源码的可以问我要。<br /> <br />当然仅仅只做代理服务器,步骤跟我上次做的案例一样这边只贴客户端出来。需求就是根据数据生成如下图所示的xml文件<br /> <br />需求如下:<br /><br /> <br />当然有人多在问servcemix用的什么做服务器,我想仔细一点的朋友应该就会知道,贴上图大家看看就明白:<br /> <br /><br /> <br />看到了么 其实apache很多组件都是用的jetty做的服务器,
dataX hdfsWrite 二次开发写入parquet文件功能背景 目前,dataX的hdfsWrite只支持TEXT以及ORC两种文件格式的写入,但是在查询性能上Parquet要优于前两者,并且spark默认的写入格式也是Parquet。所以需要在hdfsWrite的基础上进行二次开发,新增写入Parquet文件的功能。操作步骤:1、将hdfswriter-0.0.1-SNAPSHOT.jar下载下来,替换到$datax_HOME/plugin/writer/hdfswriter目录下2、
前段时间随手写的一个文件上传服务,在公司的渗透测试下漏洞百出,其中少不了路径穿越和任意文件写入漏洞。其实这两个漏洞的修复并不复杂,只要对入参进行两个条件的校验就可以了。
杂谈—例行墨迹本来还在复(xue)习(xi)数据结构,然后好好的找一个好工作,但谁知还没等你复(yu)习(xi),就赶上了返校做毕设,写论文。于是一路狂风带闪电的毕业了,然后回北京找工作,一路狂风带闪电的投简历面试,最后没钱了,有一家录取我了,我就先来了。呵呵,没想到是搞医疗的,虽然也是Android但是有些不爽啊,和我想像的做app根本不一样,而且还有入职培训—长达一个月!!!!!!!!!!是不是
漏写一个?导致app无限重启有需求需要用到seekbar,因此自然需要加入seekbar 的OnSeekBarChangeListener,因为之前的项目使用了databinding,自然而然的顺手就在viewmodel内加了个变量var seekBarChangeListener: SeekBar.OnSeekBarChangeListener?=null然后,同样的在viewdatabinding内自定义了一个添加listener的bindingadapter如下@BindingAdapter("o