`
ajax
  • 浏览: 251822 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Restlet实战(二十四)获取参数值(续)

    博客分类:
  • REST
阅读更多

这个系列之前已经有一篇文章写如何获取参数值,看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'); 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics