我正在将一个REST接口用于现有应用程序,我很好奇最合适的解决方案是什么来处理资源,如果要检索它们将返回过多的数据.
该应用程序是现有的时间表系统,其中一个资源是一组用户的"时间段".这些资源的示例URI是:
/users/44/timeslots/
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多与如何为此资源提供过滤以检索子集有关的问题,我已经有了解决方法.
我想知道如何(或者如果)我应该处理在上面的URI上发出GET将从数十或数十万行返回兆字节数据的情况,并且需要相当数量的服务器资源来实际响应第一名.
编辑:要清楚,我已经过滤和拆分实现的资源,并考虑了其他大型集合资源的分页.我想适当地回应那些没有意义的请求(显然是由构建URI的客户端请求的).
我正在实现一个RESTful API,它将Orders作为资源公开,并通过结果集支持分页:
GET /orders?start=1&end=30
Run Code Online (Sandbox Code Playgroud)
分页的订单按ordered_at
时间戳排序,降序排序.这基本上是REST Web应用程序中 SO问题分页的方法#1 .
如果用户请求订单的第二页(GET /orders?start=31&end=60
),则服务器只需重新查询订单表,ordered_at DESC
再次排序并返回位置31到60的记录.
我遇到的问题是:如果在用户查看记录时结果集发生变化(例如添加了新订单)会发生什么?在添加新订单的情况下,用户将在第二页结果的第一个位置看到旧订单#30(因为相同的订单现在是#31).更糟糕的是,在删除的情况下,用户在第二页(#31)的第一个位置看到旧订单#32,并且根本看不到旧订单#31(现在#30).
如果不以某种方式使RESTful服务器有状态(urg)或为每个客户端构建一些分页智能,我无法看到解决方案......有哪些已建立的技术可以解决这个问题?
为了完整性:我的后端是在Scala/Spray/Squeryl/Postgres中实现的; 我正在构建两个前端客户端,一个在backbone.js中,另一个在Python Django中.
首先,我已经阅读了" jQuery Grid Recommendations " 这个问题,但它没有回答我的问题.
我有一个与MongoDB后端的小型REST API:
获得所有设备:
GET /equipements HTTP/1.1
{{_id:key1, name:Test Document 1, plateforme:prod}, {_id:key2, name:Test Document 2, plateforme:prod}, ...}
Run Code Online (Sandbox Code Playgroud)
使用密钥获取设备:key1
GET /equipements/key1 HTTP/1.1
{"_id": "key1", "name": "Test Document 1", "plateforme": "prod"}
Run Code Online (Sandbox Code Playgroud)
添加新设备
PUT /equipements HTTP/1.1 {"_id": "key8", "name": "Test Document 3", "plateforme": "prod"}
HTTP/1.0 200 OK
Run Code Online (Sandbox Code Playgroud)
现在,我需要找到一种简单的方法来允许lambda用户添加/查看/ del设备.所以我认为一个像UI这样的jQuery的Web界面是最好的.我尝试 使用Sencha Rest Proxy,但我不知道javascript,我无法适应这个例子.
如何修复我的REST后端的JavaScript?
AND/OR
你能推荐一个比Sencha Rest Proxy更简单的替代品吗?(适用于我的REST后端)
答案: jqGrid
AND/OR
你会推荐我什么jQuery Grid?(适用于我的REST后端)
答案: jqGrid
最后一个问题:为什么双击时我的单元格不可编辑? …
我们正在使用返回大量数据的REST服务.在生产中,服务器硬件可以处理它.我需要通过获取本地计算机上的数据来测试REST服务,这些数据无法处理大量数据.我的本地机器是4G i5.每次我点击服务时,我都会出现内存异常.
response.getStatus()
返回200状态.但是在使用输入流读取器收集数据时,我得到了内存不足的异常.
BufferedReader br = new BufferedReader(new
InputStreamReader(newByteArrayInputStream(response.getEntity().getBytes())));
Run Code Online (Sandbox Code Playgroud)
有没有其他方法来收集数据而不会遇到内存异常?
我尝试将我的VM大小推到2G,但它仍然无效.
通常,用户进行搜索,获取命中列表,然后可以浏览它.hitlist是一个中间结果,在整个浏览过程中保持一致,通常存储在会话状态中.例如,如果新项目由其他项目同时添加,则它们仅出现在后续搜索中.
在REST应用程序中,我不能轻易获得这个中间结果 - 它既不属于客户端,也不属于模型.我在REST网络应用程序中阅读了分页,但我的答案并不完全清楚.那里的解决方案似乎假设在用户浏览结果时不更新模型.
我们当然可以将世界(模型)想象成一系列不可变的快照.通过提供一个时间戳(或全球版本号),我们就得到了模型的一致视图在那个时候,这从概念的角度来看解决了这个问题.但它确实意味着模型的完整版本.(我也想知道是否有与函数式编程相关的连接)
我该如何处理这个问题?
注意:我问,因为我打算使用play框架,它根本没有HTTP状态或会话的概念; 这是纯粹的宁静.
我有一个可以返回大量项目的RESTful API,我希望能够使用分页样式技术来限制项目数量,这在RESTful API中是个好主意吗?
如果可能最好通过链接(在这种情况下为url)或请求正文的一部分来完成?
干杯
AWC
有关如何在Rails应用程序中的资源上实现排序和分页并仍保持RESTful的任何提示?
如何以干净的方式映射页码和排序字段的参数?(我目前正在为我的应用中的每个资源使用map.resources:x)
我应该知道的任何其他性能问题?(例如缓存)
提前致谢.
编辑我将问题重新制定为更通用的问题,希望我能得到更多答案.我打算投票结束这个,因为它不再相关.感谢insane-dreamer和vrish88的答案.
rest ×7
pagination ×3
java ×2
backbone.js ×1
grid ×1
javascript ×1
jqgrid ×1
jquery ×1
restful-url ×1
scala ×1
sorting ×1
web-services ×1