这个系列之前已经有一篇文章写如何获取参数值,看Restlet实战(十二)获取参数值 ,在那篇文章中,提到了三种类型获取值。
1. 从Web Form中获取值
2. 从查询中获取值
3. 从Cookie中获取值
而本篇文章我翻译网上的一篇文章也是涉及到获取和设置参数值,算是一个补充,原文见这里
Restlet新手常见问题解答
我已经用Restlet几年了,因此我有这个机会去引导一些人去用它。当人们开始用的时候,总有一些问题。我把问题以及答案提出来,我想会有帮助的。
注意:答案是基于Restlet1.1
问题:我怎么存取URL查询参数?
有两个答案:
A1,明确的查询参数
最容易的方法是在Application里为这些参数指定一个名字,并告诉Routers这些参数。
典型的,你在Application里创建一个Router,然后通过attach(String uriPattern, Class<? extends Resource> targetClass)增加这个Router到Application。调用这个方法,返回一个新创建的Route。
为了让Router为每一次请求能从URL中抽取一个参数,调用extractQuery(String attribute, String parameter, boolean first),象:
router.attach("collection", MyCollectionResource.class)
.extractQuery("page", "page", true)
.extractQuery("perPage", "perPage", true);
一旦所有的被设置完,当你写你的Resource,并且想读取那个参数Restlet自动的将这个参数放到Map里,返回通过:
Request.getAttributes()
因此你能访问你的参数,象:
getRequest().getAttributes().get('page');
记住对一个请求来说,如果没有指定参数,get()的结果将是null,另外,如果你在extractQuery的最后一个参数设置为false,结果将是一个List。
A2,任意的查询参数
当然,有时,你需要在运行时读取一个任意查询参数,或者检查一个查询参数是否被指定。这在一个Resource里面很容易做到。通过getQuery(),象:
String fooParam = getQuery().getFirstValue('foo');
刚开始,getQuery返回一个“Form”,看起来很奇怪。但是对于这个案例来说,form被证明是很合适的而且有用的类。例如,它有一个一个很有用的方法getValuesMap(),作用是得到一个包含所有值的Map。
问题:我如何读取Request Headers
A1,标准HTTP headers
Restlet有意成为一个全面的Java API去构建和呼叫Restful Application,而不需要Restful Web application。因此restlet提供了一些在语义上能够描绘使用的restful的范例。
因此,想访问大多数HTTP headers你能够呼叫Request类的适当的方法。
一个快速引用:
HTTP Header Method of Request Referer getReferrerRef Cookie getCookies() If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match getConditions Authorization getChallengeResponse
(这个表格没有列出所有的,仅仅作为一个例子来举例说明Restlet是如何工作的)
A2,自定义HTTP headers
当然,客户端可以发送任何header作为自定义的header,你也许需要检查什么header从客户端发送过来,以及得到对应的值。Restlet将所有的request headers放到一个Form里,这个Form可以通过在request的attributes里一个指定的关键字来访问。
例如:
Form requestHeaders = (Form) getRequest().getAttributes().get('org.restlet.http.headers');
String myAwesomenessHeader = requestHeaders.getFirstValue('X-Awesomeness');
问题:我如何设定Reponse headers
Response headers工作方式与Request headers的类似。对于标准headers,有类方法支持,对于自定义的headers,则在Reponse attributes里面指定一个关键字来实现。
A1,标准HTTP headers
HTTP Header | Method of Response |
Location | setLocationRef() |
Server | setServerInfo() |
WWW-Authenticate | setChallengeRequest() |
一些可以从Reponse表示中获得的headers
HTTP Header | Method of Representation |
Last-Modified | setModificationDate() |
Etag | setTag() |
Content-Size | setSize() |
Expires | setExpirationDate() |
A2,自定义HTTP headers
Form responseHeaders = (Form) getResponse().getAttributes().get('org.restlet.http.headers');
if (responseHeaders == null)
{
responseHeaders = new Form();
getResponse().getAttributes().put('org.restlet.http.headers', responseHeaders);
}
responseHeaders.add('X-Awesomeness', 'true');