我是 RESTful Web 服务和 RESTlet 的新手。我们只有构建基于 servlet 的 Web 应用程序(JBoss/Apache 上的 Servlet/JSP)的经验。现在,我们正在构建一个基于 RESTlet 的应用程序,其中服务器端 API 将由两种类型的客户端使用 - 使用浏览器的 Web 和通过桌面的基于 swing 的客户端。
我的理解是,根据 REST 概念 a) 服务器无法维护 session 以提高可伸缩性和其他一些原因 b) 客户端的每个请求都应该是独立的
现在,我真的很困惑如何实现这一目标。假设我们采用一个简单的购物车应用程序。
Step 1) Client发送认证请求,Server认证,Server响应OK。
第 2 步) 客户端发送将商品添加到购物车的请求。服务器响应正常。
第 3 步)客户发送另一个请求,将第 2 项添加到购物卡中。服务器响应正常。
通常,在一个普通的网络应用程序中,一个 session 是在服务器上的第 1 步中创建的,从那时起,所有与该客户端相关的请求都自动与同一 session 相关联,我们存储 session 状态(在这种情况下为购物车) 在 session 对象中,并使用来自客户端的后续请求检索/更新它。
现在,在上面的场景中:
1) 如果服务器上没有维护 session ,我们如何在步骤 2 和 3 中对客户端进行身份验证和授权?
2) 客户端是否需要在每个请求中发送一些额外的信息?
3) 我们如何在第 3 步中检索客户特定的购物车?
4) 客户端是否需要在步骤 3 中再次发送服务器在步骤 2 中创建/返回的购物车?
显然,这是最简单的用例,因此每个开发 RESTful 网络服务的人都必须设计他们的应用程序来处理这个问题。使用 RESTLet 在 RESTful Web 服务中处理 session 管理、身份验证、授权的最佳和最常用方法是什么?如果我们必须使用客户端数据在服务器端维护缓存,那么这与服务器代表我们维护 session 有何不同?
提前致谢, 深
最佳答案
1) how do we authenticate and authorize Client in Step 2 and 3 if there is no session maintained on the server ?
2) does client need to send some additional information with each request ?
是的。您必须随每个请求发送身份验证/授权数据。这就是阻止服务器“记住”你是谁的原因(即无状态服务器,无 session )
3) How do we retrieve the client specific Shopping Cart in Step 3 ?
让我们问一个不同的问题:如果服务器重新启动会发生什么?您想让所有购物车数据丢失吗?可能不会。这意味着您必须将它存储在某个地方,以便它可以在重启后继续存在。暗示持久存储。可能在服务器或客户端...
...现在,如果您的客户端重新启动怎么办?您可以选择使用 POST 请求(当用户添加第一个项目时)为该用户创建购物车“资源”,或者在客户端登录时创建它(浪费)。然后您继续使用 PUT/DELETE 更新购物车并使用 GET 获取它。
它应该在数据库中吗?可能是,取决于那是否是您想要的样子。如果它必须是持久的,这是一个很好的保存它的地方,这样它就可以在重启后继续存在。
那么如何接收客户特定的购物车呢?好吧,您只需发送资源的 GET 请求!!!而已!第一个 POST 将在适当的 URL 上创建一个资源,然后您可以使用它。
Restful Web 服务也有 Restful URL,所以这是设计的关键部分。
4) Does the client need to send it's Shopping Cart that was created/returned by server in Step 2 again in Step 3 ?
没有。正如刚才提到的。但是,如果您在客户端使用 cookie 或 LocalStorage 或其他一些信息,那么您可能会这样做。
Obviously, this is the simplest use case and so every one developing RESTful web services must be designing their app to handle this. What is the best and most common way to handle session management, authentication, authorization in RESTful web services using RESTLet ?
是的。这很简单,但从“资源”而不是“服务”的角度来思考需要花费一些时间。在 restful 设计中,一切都是(或可以是)资源,包括交易、购物车等,
然而,授权/认证是 http 请求数据包的一部分,并随每个请求一起发送。我建议您仔细阅读这些内容。
If we have to maintain cache on server side with the client's data then how is this different from server maintaining sessions on our behalf ?
差别很大!您是为了性能而缓存还是为了维护 session ?如果系统重新启动,您的系统会在空缓存上无缝运行吗?如果是,您正在缓存性能,否则您正在维护状态。
我强烈建议您阅读 Richardson 和 Ruby 的 RESTful Web Services 以启发上述概念并更深入地了解 REST 服务是如何设计的……这需要一些时间来适应。
关于java - 如何使用 RESTlet 在 RESTful Web 服务中强制执行 'sessions'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7711657/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru