return four types of Java constructs:
1. Returning plain Java constructs
通常情况下,resource class返回一个标准的Java Type, 一个JAXB对象,或者任何的对象(应用程序有对应的Entity
Provider);在这种情况下,运行环境将使用返回的对象来决定MIME type信息,运行环境也决定使用适合的HTTP
Code发送给Consumer.
(1) Returnable types: 可以是null或者是:Java 原生类型,Java原生类型的Numbet representations, JAXBObject.
(2) MIME types: 运行环境决定返回Entiy 的MIME type首先检查resource method 和 resource class的@Produce
注解;如果找到一个,将使用注解中指定的MIME type,如果没有找到,将依赖与Entity Provider来决定适合的
MIME Type.默认情况下,运行环境分配MIME Type按照下面的方式进行:
(3) Response codes
如果resource method完成处理时没有抛出异常并且返回了Plain Java Constructs时,运行环境将自动设置response
status code:
2. Basics of building responses
Response Object 包装了返回给Consumer的Entity,该对象使用ResponseBuilder工厂类进行实例化。
获取Reponse Builder: 有两种方法:
(1) 使用Response类的静态方法:
import javax.ws.rs.core.Response; Response r = Response.ok().build();
(2) 使用ResponseBuilderImpl类
import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl; ResponseBuilderImpl builder = new ResponseBuilderImpl(); builder.status(200); Response r = builder.build();
3. Creating responses for common use cases
(1) Creating responses for successful requests
例如:下面的例子返回HTTP Status 200并包含一个Entity:Customer:
import javax.ws.rs.core.Response; import demo.jaxrs.server.Customer; Customer customer = new Customer("Jane", 12); return Response.ok(customer).build();
如果希望返回值是200,但没有Content,可以使用Response.noContent() method:
import javax.ws.rs.core.Response; return Response.noContent().build();
(2) Creating responses for redirection
Response Class 提供了method用于处理redirection response statuses:
A. 303 See Other:当request resource需要用久的重定向consumer至一个新的resource时,使用Response类的
seeOther() method;
B. 304 Not Modified:当request resource没有改变时,使用notModified() method;
import javax.ws.rs.core.Response; return Response.notModified().build();
C. 307 Temporary Redirect:当request resource需要引导consumer至一个新的resource,但是想consumer继续
使用这个resource来处理未来的request时,使用temporaryRedirect() method.
(3) Creating responses to signal errors
Response Class提供了类处理两个基本的Error:
A. serverError()(): Status of 500 Internal Server Error;
B. notAcceptable()(java.util.List<javax.ws.rs.core.Variant> variants): 创建一个Reponse,有406 Status Code和一
个Entity(包含a list of acceptable resource types).
import javax.ws.rs.core.Response; return Response.serverError().build();
4. Handling more advanced responses
(1) Adding custom headers
import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl; ResponseBuilderImpl builder = new ResponseBuilderImpl(); builder.header("username", "joe"); Response r = builder.build();
(2) Adding a cookie
import javax.ws.rs.core.Response; import javax.ws.rs.core.NewCookie; NewCookie cookie = new NewCookie("username", "joe"); Response r = Response.ok().cookie(cookie).build();
(3) Setting the response status
import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl; ResponseBuilderImpl builder = new ResponseBuilderImpl(); builder.status(404); Response r = builder.build();
(4) Setting cache control directives
import javax.ws.rs.core.Response; import javax.ws.rs.core.CacheControl; import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl; CacheControl cache = new CacheControl(); cache.setNoCache(true); ResponseBuilderImpl builder = new ResponseBuilderImpl(); builder.cacheControl(cache); Response r = builder.build();
5. Returning entities with generic type information
如果应用程序需要更多的控制返回对象的MIME Type或者Entity Provider序列化Reponse, JAX-RS类
javax.ws.rs.core.GenericEntity<T>提供了更细粒度的控制。
Creating a GenericEntity<T> object
有两种方法:
A. 使用将被包装的Entity来创建GenericEntity<T>的子类:
import javax.ws.rs.core.GenericEntity; List<String> list = new ArrayList<String>(); GenericEntity<List<String>> entity = new GenericEntity<List<String>>(list) {}; Response response = Response.ok(entity).build();
B. 使用Entity的Generic Type信息直接创建Instance:
import javax.ws.rs.core.GenericEntity; AtomicInteger result = new AtomicInteger(12); GenericEntity<AtomicInteger> entity = new GenericEntity<AtomicInteger>(result, result.getClass().getGenericSuperclass()); Response response = Response.ok(entity).build();