我正在设计一个RESTful Web服务(JBoss + RESTeasy).UI程序员正在编写一个将使用它的Ajax Web应用程序.Web应用程序将是一个HTML页面,其中所有内容都使用JavaScript完成.为安全起见,所有流量都通过SSL.
目前我正在使用基本身份验证.UI程序员可以显示一个对话框来获取用户名和密码,并在标题中添加"Authorization:Basic xxxxx".不幸的是,如果密码错误,会出现丑陋的浏览器登录对话框.此外,用户无法注销.这是无法接受的.
在我们将使用的任何浏览器中似乎都无法拦截对XMLHttpRequest的401响应.
基于表单的身份验证对我们不起作用.我们需要在一段时间不活动(相当于会话超时)后自动注销.当客户端需要JSON对象时,我们不能让服务器突然返回登录页面.
JBoss提供四种身份验证策略:BASIC,FORM,CLIENT-CERT和DIGEST.我认为DIGEST与BASIC有同样的问题.这四个都不是我们想要的.
此Web应用程序将是唯一的客户端(目前),因此不需要使用BASIC.我可以安装其他任何身份验证策略吗?例如,我可以使用WSSE UsernameToken的实现吗?(如在O'Reilly的REST Web服务本书的第8章描述.)服务器将在WWW身份验证标头中发送"WSSE",而不是"基本"和大概的浏览器会忽略它和权利,通过它传递.
我想配置它所属的安全性 - 在JBoss配置文件中,而不是在我的RESTful Web服务中 - 所以我正在寻找一个可以插入JBoss的实现.
假设一个类(例如URI)可以使用构造函数和toString()方法转换为String或从String转换.
我有一个ArrayList<URI>,我想把它复制到一个ArrayList<String>,或者反过来.
Java标准库中是否有实用程序功能可以执行此操作?就像是:
java.util.collections.copy(urlArray,stringArray);
我知道有实用程序库提供该功能,但我不想添加不必要的库.
我也知道如何编写这样的函数,但是阅读代码并发现有人编写了标准库中已存在的函数,这很烦人.
http://kenai.com/projects/suncloudapis/pages/Home上的Sun Cloud API 是RESTful API的一个很好的示例.忠实于RESTful原则,当您获取资源时,您获得的资源不会少于或少于该资源的表示.
响应中的Content-Type标头可以准确地告诉您该资源的类型,例如application/vnd.com.sun.cloud.Snapshot + json.Sun已将这些mimetypes注册到IANA.
目前这一般有多实用?我见过的大多数API都使用了"application/json"的Content-Type.这告诉你响应是JSON,但没有更多关于它.你必须在JSON对象中有一些东西,比如"type"属性,才能知道它是什么.
我正在设计一个RESTful API(不会公开,因此我不会注册mimetypes).我一直在使用RESTEasy,我发现即使我指定了一个完整的mimetype,响应头中的Content-Type也将是Accept请求头指定的内容.如果请求默认请求"application/*+ json",则响应头将具有"application/*+ json".我可以通过在响应消失之前更改标题来解决这个问题,但是我应该尝试这样做吗?或者响应是否应该像请求那样具有通配符?
或者我应该像大多数API似乎一样提供"application/json"?
后来添加的其他想法:
陈述问题的另一种方法是:我应该使用HTTP作为协议,还是应该仅使用HTTP作为传输机制来包装我自己的协议?
要使用HTTP作为协议,响应的实体主体包含所请求对象的表示(或错误消息对象的表示),"Content-Type"标头包含对象的确切类型,以及"状态" "标头包含成功或错误代码.
要将HTTP仅用作传输机制,"Status"标头始终设置为200 OK,"Content-Type"是通用的,如"application/json",实体主体包含自身具有对象的内容,对象类型,错误代码以及您想要的任何其他内容.如果您自己的协议是RESTful,那么整个方案就是RESTful.(HTTP是RESTful协议,但不是唯一可能的协议.)
您自己的协议对所有传输层都是不透明的.如果您使用HTTP作为协议,所有传输层都将理解它并可能做您不想要的事情; 例如,浏览器将拦截"401 Unauthorized"响应并建立登录对话框,即使您想自己处理它.
我编写了一个RESTful servlet,UI开发人员想要在服务器上保存登录状态.
他提出了这个奇怪的说法:"我没有遇到过纯REST的生产REST实现.我见过的所有实现都让服务器维持会话."
我发现这很难接受.首先是技术性,那里有很多普通的HTTP页面,都是纯粹的RESTful.其次,是的,有非RESTful实现标记为RESTful,就像黄铜标记为"黄金"一样.第三,仅仅因为其他人从桥上跳下来并不意味着我应该.
背景:这是一个使用HTTPS和基本身份验证的JavaScript Ajax Web应用程序.为避免通常(不可自定义的)浏览器登录弹出框,应用程序会显示一个登录屏幕,其中包含产品徽标和名称和密码的文本框.名称和密码存储在文档中,并在每个请求的Authorization标头中发送.如果刷新页面,则名称和密码将丢失,用户必须再次输入.这被认为是一个错误; UI开发人员希望能够再次按下刷新按钮而不再提供密码.
因此开发人员想要使用cookie或JSP会话.Abby,最终每个REST实现都在服务器上维护应用程序状态吗?或者有没有办法解决这个问题,仍然保持我的RESTful纯度?
Dojo Toolkit过去常常带有一个名为"Doh"的测试工具.它位于/ utils目录中.
现在当你下载dojo-release-1.3.2时,无法找到/ utils目录.
Doh已经死了吗?
RESTEasy(JAX-RS)允许通过子资源进行动态调度.例如:
POST /customers/create
{"name":"Smith","country":"jp"}
Run Code Online (Sandbox Code Playgroud)
我们可以使用根资源来处理路径"/ customers",其方法是使用没有HTTP方法但使用@Path("/ create")注释的方法.此方法返回JAX-RS查看的资源以继续处理请求.但是,此资源必须处理"/ customers/create"路径.
我有一个现有的情况,可以创建不同类型的实体:
POST /customers/create
{"name":"Smith"}
POST /locations/create
{"name":"Chicago"}
Run Code Online (Sandbox Code Playgroud)
我想基于请求正文中的附加属性添加创建任何类型实体的功能:
POST /entities/create
{"type":"customer","name":"Smith"}
Run Code Online (Sandbox Code Playgroud)
本质上,我想将请求转发到处理"POST/customers/create"的代码.我可以编写为"POST/entities/create"调用的子资源定位器并返回Customer资源,但是JAX-RS无法调度请求,因为Customer资源不处理路径"/ entities/create".有没有办法在转发请求时将URL更改为/ customers/create?
此时我无法更改API以使"客户"成为"实体"的真正子资源.
假设InvalidResourceException是ResourceException的子类.定义两种方法:
void handleException(ResourceException e) {
System.out.println("ResourceException " + e.toString());
}
void handleException(InvalidResourceException e) {
System.out.println("InvalidResourceException " + e.toString());
}
Run Code Online (Sandbox Code Playgroud)
现在以下代码:
try {
throw new InvalidResourceException("invalid resource");
} catch (ResourceException e) {
handleException(e);
}
Run Code Online (Sandbox Code Playgroud)
打印这个:
ResourceException: com.myPackage.InvalidResourceException: invalid resource
Run Code Online (Sandbox Code Playgroud)
但是以下代码:
try {
throw new InvalidResourceException("invalid resource");
} catch (InvalidResourceException e) {
handleException(e);
} catch (ResourceException e) {
handleException(e);
}
Run Code Online (Sandbox Code Playgroud)
打印这个:
InvalidResourceException: com.myPackage.InvalidResourceException: invalid resource
Run Code Online (Sandbox Code Playgroud)
这是Sun的JDK 1.5.0_15.
这与Java标准一致吗?
这段代码应该怎么做?
Exception e = new InvalidResourceException("invalid resource");
handleException(e);
Run Code Online (Sandbox Code Playgroud)
这段代码应该怎么做?
Exception e = new InvalidResourceException("invalid …Run Code Online (Sandbox Code Playgroud) 示例:iPhone中的"联系人"不会将联系人组织到组(邮件列表)中.您可以编写一个在手机上维护数据库的应用程序.团体可以是"同事","派对朋友","亲戚"等.
从另一个应用程序,很高兴打电话给这个应用程序.
想象一下名为"TellMyFriends"的应用程序.此应用程序可以召唤照片库选择照片,或相机拍摄新照片.(您可以使用iPhone SDK执行此操作.)
现在您要将照片发送给"派对朋友".您想召唤具有组数据库的第二个应用程序.选择"派对朋友"组,然后返回第一个应用随后可在手机通讯录中找到的姓名列表.可以这样做吗?
rest ×3
ajax ×2
java ×2
collections ×1
cookies ×1
doh ×1
dojo ×1
instanceof ×1
iphone ×1
jax-rs ×1
json ×1
mime-types ×1
resteasy ×1
session ×1
stateless ×1
unit-testing ×1