`
icefire
  • 浏览: 125022 次
  • 性别: Icon_minigender_1
  • 来自: 深圳、重庆
社区版块
存档分类
最新评论

有关REST

阅读更多
关注REST说起来,应该是很长时间了,还读过Roy Thomas Fielding博士的那篇论文(中文版),但是对于rest的应用还是很少的,主要和现在的一些基础建设有关,最主要还是受限于开发模式和人的思维。人们已经习惯了传统的MVC模式,要跳出这个模式,是困难的。(REST已经有JCP标准和几个实现,Spring MVC是其中一个)

在REST里,最重要的一步是,做资源抽象,整个REST就是围绕资源来的。退回到最初的互联网,只有静态页面的时候,这时资源是清晰的,但操作只有GET。对于一个资源来说,GET,POST,DELETE,PUT四种方法似乎是够了,但对于传统的MVC来说,是远远不够的,客户的需要都抽象成一个个的操作,而REST里,就需要重新发现资源。例如在登录上,对于mvc是login和logout。而rest的GET,POST,DELETE,PUT和这个不搭调。那么如果这样,抽象会话为资源/session,对/session做POST和DELETE,这样就正好对应了功能上的登录和注销。

其实对于REST,我最欣赏的是它所描述的,资源和URL的对应性,不变性。后台不管采用什么技术,URL都使用REST风格的话,那么可以做到任意的技术切换,而URL永远有效。这点上和域名其实是一个道理。服务器的IP,经常是变动的,而采用域名后,通过域名解析,这样可以很容易的切换IP,做服务器切换和迁移。最理想的是,今天我的论坛是用ASP实现的,后天是用PHP实现的,由于采用REST,所以你收藏夹里所有URL都是还是有效的。

其实想到这些,还是因为在看公式权限框架时想到的。现在公司有很多机制,这些机制大多数是通过url嵌入进来的,由于机制是对公的,所有模块都能调用,这样所有调用,都必须带上上模块标识甚至是文档标识才行。这样的情况下,权限虽然能做,但还是有些不便的情况。附件下载就是最典型的。在附件下载的时候,我们常只用ID来指定要下载的附件,同时服务器会根据当前附件存在服务器的信息来判断权限。这个判断就写得比较死,只能根据默认规则来,导致模块部署附件后,没办法真正去替换附件的权限,只能接受唯一的规则。其实作为机制来说,模块需要的是复用机制的功能,而其他权限之类的就不一定要复用了。增多不同的应用,对于这种机制的使用,都有这自己的独特的方式,甚至是定义调用的规则。而且当前很多机制都配置了一个角色,模块中要使用这个功能,还得分配这个机制角色给用户,相当不便,其实对于用户来说,正对模块给权限就好了,结果我还得理解这个模块的一些功能和机制有什么关系。如果模块里有两个评论,一个是机制,一个不是,那么不直接晕倒了?

两者风格下,机制调用方式的对比
/comment.do?method=add&modelName=blog&modelId=12345
/blog/12345/comment/add (这不是真正的REST,只是一总类似风格)
相比来说,下面的REST风格更好理解,看着舒服。由于在对外表象上来说,完全是子功能的暴露,这样完全看不出来是调用的机制,而真正是一个没用动手写代码的功能。然后权限你要怎么拦截,完全是这个模块说了算。如果机制提供的功能不能满足需求,那么可以模块再开发一个同样的功能,对外URL依然可以是不变的。当然也有比较郁闷的,由于url是映射到模块上的,那么需要写代码来调用/转发请求到机制?这是个问题,要是不能省代码,机制的复用性就打折扣了。其实也有解决方法,那就是url服务器端的重写,把/blog/12345/comment/add这个请求,按照规则映射到/comment.do?method=add&modelName=blog&modelId=12345上面。这个技术也是老的MVC框架实现REST风格的有效方法。

REST风格对于当前机制还有一个好处。那就是,url的名称是有限的,也是资源,机制调用占用了/comment这对外根目录,当/comment模块本身需要要有全局功能暴露时,变得比较被动。使用rest风格/comment就可能解放了,这个可以作为全局观察所有模块调用/comment机制的监控模块。其实本质上,我们需要的复用功能,不要写代码,对于一个完整的模块,都希望所有功能就在模块上做了,不希望还要跳出去,在别的地方做点什么,再回来。对于URL来说,也是,希望看到一个更简洁漂亮的。
分享到:
评论

相关推荐

    解答有关REST的十大疑惑

    ### 解答有关REST的十大疑惑 #### 一、REST或许适用于CRUD,但它是否能够处理“真实的”业务逻辑? 这是很多初次接触REST架构的人经常提出的一个疑问。他们担心REST是否只适用于基本的增删改查操作,而对于更复杂...

    解答有关REST的十点疑惑.doc

    REST(Representational State Transfer,表述性状态转移)是一种软件架构风格,主要应用于网络应用程序的设计,尤其是Web服务。它强调使用HTTP协议的动词(GET、POST、PUT、DELETE等)来实现CRUD(Create、Read、...

    REST相关jar包

    综上所述,"REST相关jar包"可能包含了上述提到的库,如Jersey、Jackson、Spring Boot等,它们共同构成了RESTful服务的基础架构。了解这些库的作用和使用方式,对于开发、调试和维护REST接口至关重要。通过熟练掌握...

    nodejs+websock+rest+rest调用

    该平台能实现基于ws的聊天室,可以将聊天的信息调用rest api存储到数据库,可以通过网页访问该平台提供的rest api后再进行ws的相关操作,也就是说把ws的聊天服务端与rest的调用以及rest的网站发布整合到了一起。...

    REST地图与天地图叠加

    1. 引入SuperMap iClient库:在Flex项目中,我们需要导入SuperMap iClient的相关库,以便使用其提供的地图操作和REST服务调用功能。 2. 初始化地图容器:创建一个地图容器,设置地图的基本属性,如初始位置、比例尺...

    Power BI Embedded 的工作流及相关REST API命令介绍1

    使用 `GET /v1.0/gateways/{gatewayID}/datasources` 和 `GET /v1.0/datasets/{datasetID}/datasources` 命令来获取相关信息。 5. **更新数据源凭据**:使用 `PATCH /v1.0/gateways/{gatewayID}/datasources/{...

    Rest Severs in Delphi XE Using DataSnap

    对于REST接口,我们需要创建一个或多个TWebModule,每个模块对应一个或一组相关的REST服务。在TWebModule中,添加TRESTServer和TRESTRequestHandler组件,它们负责处理HTTP请求和响应。 然后,配置TRESTServer组件...

    REST服务示例入门

    5)打开http://localhost:8080/RestApplication/update.jsp页面,输入相关信息,提交;如果提交失败,请检查页面表单的 action属性值是否正确; 6)重复4),查看信息被修改的情况; 3、使用Component绑定多个...

    Django-REST-framework教程中文版

    这部分内容涉及到了在序列化过程中如何设置超链接,使用HyperlinkedModelSerializer来创建可以导航到相关对象的API。 最后,在ViewSets和Routers章节中,介绍了如何使用路由器(Routers)来自动处理URL配置,这些...

    dubbox 2.8.4 rest调用

    2. **dubbox配置**:在项目的配置文件中,会有dubbox的相关配置,比如服务提供者和服务消费者的定义,以及REST服务的配置。 3. **REST接口实现**:在Java代码中,会看到使用dubbox提供的API实现的REST服务,这些...

    Rest服务搭建范例

    在Maven项目中,你会在pom.xml文件中看到jersey相关的依赖,如`jersey-container-servlet-core`、`jersey-media-multipart`等,这些依赖用于提供HTTP容器集成和处理不同媒体类型的能力。 接下来,查看项目中的源...

    REST WebService简单应用

    5. HATEOAS(Hypermedia as the Engine of Application State):这是REST的一个重要特性,允许服务返回包含链接的资源,使客户端能发现和导航到其他相关资源。 在"REST WebService简单应用"这个主题中,可能涉及的...

    flowable-boot-rest_rest_flowableapi_flowableswagger_flowable_flo

    Flowable REST API提供了丰富的端点,用于创建、读取、更新和删除(CRUD)各种流程相关的实体,如任务、流程实例、模型、事件等。这些API使用JSON格式传输数据,使得与其他系统集成变得更加便捷。Spring Boot的应用...

    关于activiti rest服务

    3. **任务管理**:任务是流程中的一个重要概念,REST API提供了处理任务的接口,包括获取任务列表,领取任务,完成任务,以及设置任务相关的变量。 4. **身份管理**: Activiti REST API也支持用户和组的管理,包括...

    rest的所有jar

    Spring MVC或Spring Boot提供了方便的REST服务开发支持,相关的JARs包括spring-web、spring-webmvc等。 7. **HTTP客户端库**:如Apache HttpClient或OkHttp,这些库提供了发送HTTP请求的功能,便于进行单元测试或...

    Struts2 Rest方式和非Rest方式共存

    3. **拦截器配置**:可能需要为RESTful请求配置不同的拦截器栈,以便它们可以处理身份验证、授权和其他与RESTful服务相关的逻辑。 4. **结果类型**:对于RESTful请求,可能需要定义或扩展现有的Result类型,以便...

    dubbo rest rpc相关jar包

    在标题和描述中提到的“dubbo rest rpc相关jar包”是指Dubbo支持RESTful API调用的扩展模块,这使得Dubbo能够与更广泛的Web服务和微服务生态系统集成。 首先,我们来详细了解一下`dubbo-2.8.4.jar`。这是Dubbo的...

    JavaScript天地图叠加REST地图服务

    4. 加载天地图服务:通过调用SuperMap的相关方法,配置REST地图服务的URL,加载天地图的基础图层。 5. 叠加REST服务:如果需要叠加其他REST服务,如专题图层,再次调用API,传入相应的服务URL和参数。 6. 显示地图:...

    rest api 接口测试工具

    本文将深入探讨REST API接口测试工具的相关知识。 一、REST API接口测试的重要性 1. 确保功能正确性:测试工具可以帮助开发者验证每个端点(endpoint)的功能是否按照预期工作,包括GET、POST、PUT、DELETE等HTTP...

Global site tag (gtag.js) - Google Analytics