所以,我正在使用RESTeasy和Google App Engine开发REST Web服务.我的问题与GAE无关,但我提到它只是在重要的情况下.事实上,我需要保护我的资源和我自己的用户(不是谷歌的).
保护REST Web服务似乎是一个非常有争议的主题,或者至少是一个非常"自由"的主题.REST没有对此事项施加任何标准.根据我在网络和文献上的研究,我认为至少有3种方法可能适用于我的应用程序:
OAuth似乎是最完整的方法.但我认为不需要这么复杂,因为我不需要授权任何第三方应用程序.它是仅由我自己的客户端应用程序使用的Web服务.
HTTP Basic和HTTP Digest在Web上看起来是最简单的,但事实是我从未使用RESTeasy找到它们的具体实现,例如.我发现这个网页和这一个 RestEasy的的文档.它们确实非常有趣,但它们对此主题(HTTP Basic或Digest)几乎没有任何说明.
所以,我在这里问:
如何使用RESTeasy中的HTTP Basic或Digest保护我的WebService?
也许这很简单,在文档中或其他任何地方都不值得一提?此外,如果有人能够就保护RESTful Web服务的问题向我提供一些见解,那么它可能会有所帮助.
我选择了正确的方法吗?
我正在使用Spring,Jersey和Hibernate(JPA)在Java中构建REST Web服务.
现在我正在尝试在我的资源中添加对验证的支持.JSR-303(Bean验证)自然是一个合适的选择(我使用的是Hibernate Validator,它是JSR-303的参考实现).但是,我试图首先巩固一些概念.
在我看来,至少有两种可能的验证:
String属性是否是有效的电子邮件,检查Integer属性是否大于10等等.这是按预期工作的.我已经注册了一个JAX-RS ExceptionMapper,它可以映射javax.validation.ConstraintViolationException到正确的HTTP响应中.我将通过"数据完整性验证"的例子来解释我的意思.当两个或多个资源之间存在关系时会发生这种情况.想象一下两个资源:a Product和a Category.A Product 有一个Category.当客户端向服务器发送要Product创建的表示(POST HTTP请求)时,它必须通知Category产品.当然,客户必须事先知道类别.用JSON想象一下:
{
"quantity": "10",
"state": "PRODUCED",
"category": {
"id": "123"
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,id的类别123可能不存在.如果我们尝试将其插入数据库,显然我们会得到一个与外键相关的异常.所以我假设我们必须验证这些问题并向客户端返回正确的消息,就像在常规属性验证中一样.
现在,我的主要问题是:
这些问题与Java有些相关,但我也希望对这些问题有一些新的看法.一些技术独立的.:)如果您可以在REST Web服务上为这些问题提供自己的解决方案,那就太棒了.
现在,我对Ember Data的主要问题是,当我改变一个关系(hasMany或belongsTo)时,父亲不会变脏.
我需要这个因为:
isDirty属性来显示保存/取消按钮此外,当我回滚父级时,仅还原belongsTo关系.hasMany型号保持不变.
我发现这个问题涉及一个dirtyRecordsForHasManyChange钩子,但这似乎不存在于Ember Data v1(v1.0.0-beta.3,这就是我正在使用的)中.
我怎么能做到这一点?
谢谢.
在过去的几年中,Web应用程序经历了一次巨大的范式转变.
十年前(不幸的是,甚至现在),Web应用程序只存在于加权服务器中,处理从数据到表示格式的所有内容,并发送到仅呈现服务器(浏览器)输出的哑客户端.
然后AJAX加入了游戏,Web应用程序开始变成服务器和浏览器之间的东西.
在AJAX的高潮期间,Web应用程序逻辑开始完全在浏览器上运行.我认为这是在HTTP RESTful API开始出现的时候.突然间,每个新服务都有它的 RESTful API,突然间,JavaScript MV*框架开始像popcorns一样弹出.移动设备的使用也大大增加,REST非常适合这种情况.我在这里说"有点RESTful",因为几乎所有声称都是REST的API都不是.但那是一个完全不同的故事.
事实上,我成了一名" REST传播者 ".
当我认为Web应用程序无法发展得更多时,一个新的时代似乎正在曙光:有状态的持久连接Web应用程序. Meteor是这种应用程序的杰出框架的一个例子.然后我看了这个视频.在这个视频中,Matt Debergalis谈到Meteor,两人都做得非常出色!然而,他有点为了这种目的而放弃REST API,以支持持久的实时连接.
例如,我非常希望能够进行实时模型更新,但仍然拥有所有REST非常棒的功能. 流式REST API看起来就像我需要的那样(例如,firehose.io和Twitter的API),但这种新型API的信息非常少.
所以我的问题是:
基于Web的实时通信是否与REST范式不兼容?
(很抱歉很长的介绍性文字,但我认为这个问题只适用于某些背景)
我需要以特定方式配置Jackson,我将在下面介绍.
idid"_id"后缀添加到属性名称"_ids"后缀添加到属性名称@JsonId,最好有一个可选的值来覆盖名字就像@JsonProperty做@JsonIdentityInfoid属性可发现性的注释(例如,对JPA场景有用)考虑到这些POJO:
//Inform Jackson which property is the id
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id"
)
public abstract class BaseResource{
protected Long id;
//getters and setters
}
public class Resource extends BaseResource{
private String name;
@JsonId
private SubResource subResource;
@JsonId
private List<SubResource> subResources;
//getters and setters
}
public class …Run Code Online (Sandbox Code Playgroud) 我有一个有 60 多个视图的 mysql 数据库,一些是辅助的,一些是最终的。它们之间存在依赖关系。这当然给我带来了性能问题,但我没有设计这个数据库和系统。
为了加快一些报告的速度,我将最终视图具体化为表格。我也可以通过具体化辅助视图来加速这个过程,然后使用它们来具体化其他视图,避免对辅助视图进行重新处理。
为此,我需要一种方法来查看视图之间的依赖关系,以便我可以以正确的顺序具体化视图。如果我可以将该信息输入到图表中(例如使用 Graphviz 或 Tikz 等工具),那就太好了。
除了手动分析每个视图之外,还有什么方法可以做到这一点?
我正在为emberjs制作传单视图,我遇到了一些问题.Leaflet是一个外部库,与问题有点无关,但只知道它是一个映射库.
考虑像缩放级别这样的简单属性.传单映射实例具有map.getZoom()可通过其访问和分配的缩放级别map.setZoom(zoomLevel).此外,用户可以与地图交互,并更改其缩放级别.Leaflet允许我们在缩放变化时注册回调.
我希望我的"Ember-Leaflet"视图有一个zoomLevel余烬属性.这样我就可以从ember对象模型中受益(例如,绑定zoomLevel到模板或另一个值),我们正在"使用ember方式".
我目前拥有的是Ember.View的子类,具有zoomLevel属性.在didInsertElement我创建Leaflet地图实例.代码已注释,应该是不言自明的.
App.Leaflet = Ember.View.extend({
classNames : ['ember-leaflet'],
//default zoom level
zoomLevel : 13,
didInsertElement : function() {
var self = this;
var zoomLevel = this.get('zoomLevel');
// create map instance
var map = L.map(this.$().get(0)).setView(center, zoomLevel);
// configure map instance...
// Event listeners
map.on('zoomend', function(e) {
self.set('zoomLevel', e.target.getZoom());
});
// save map instance
this.set('map', map);
}
});
Run Code Online (Sandbox Code Playgroud)
为了使这个问题更"可回答",我认为这个问题的解决方案应该满足以下要求:
zoomLevel更改属性后,地图应相应地更改其缩放级别(使用map.setZoom(zoomLevel))zoomLevel …我正在开发一个RESTful webservice,其中spring-data作为其数据访问层,由JPA/Hibernate支持.在域实体之间建立关系是很常见的.例如,设想一个实体Product,其具有一个Category实体.
现在,当在客户端POSTSA Product表示到JAX-RS方法.该方法@Transactional用于在事务中包装每个存储库操作进行注释.当然,客户端只发送id一个已经存在的Category,而不是整个表示,只是一个引用(外键).
在那种方法中,如果我这样做:
entity = repository.save(entity);
Run Code Online (Sandbox Code Playgroud)
变量entity现在Category只有id字段集.这并没有让我感到惊讶.我没想到要保存(SQL插入)来检索相关对象的信息.但我需要整个Product对象和相关实体能够返回给用户.
然后我这样做了:
entity = repository.save(entity);
entity = repository.findOne(entity.getId());
Run Code Online (Sandbox Code Playgroud)
也就是说,在持久化之后,在同一个事务/会话中检索对象.
令我惊讶的是,变量entity没有改变任何东西.实际上,数据库甚至没有获得单个选择查询.这与Hibernate的缓存有关.出于某种原因,当在同一事务中时,如果该对象先前已持久化,则查找不会检索整个对象图.
使用Hibernate,解决方案似乎是使用session.refresh(entity)(参见本节和此).说得通.
但是如何通过弹簧数据实现这一目标?
我想避免创建重复的自定义存储库.我认为这个功能应该是spring数据的一部分(有些人已经在spring数据论坛中报告过:thread1,thread2).
要重现此问题,您可以访问http://leafletjs.com/并在javascript控制台中编写以下内容:
> map.getZoom()
15
> map.setZoom(10);map.setZoom(1);
Object
> map.getZoom()
10
Run Code Online (Sandbox Code Playgroud)
我期待最后的getZoom回归1.为什么会这样?问题可能与缩放动画有关.如果在动画结束之前调用setZoom,则会忽略它.
我正在将传单与emberjs集成,并希望通过外部更改允许缩放更改.如果用户快速更改缩放,则效果不是所需的.
java ×4
ember.js ×3
rest ×3
ember-data ×2
javascript ×2
jpa ×2
leaflet ×2
graph ×1
hypermedia ×1
jackson ×1
jersey ×1
json ×1
meteor ×1
mysql ×1
real-time ×1
relationship ×1
resteasy ×1
sql ×1
view ×1
web-services ×1
websocket ×1