i´m implementing a Restful service using Jax-RS 2.0 (Resteasy 3.0.7.Final) and share the interface between client and service.
我正在使用Jax-RS 2.0(Resteasy 3.0.7.Final)实现Restful服务,并共享客户端和服务之间的接口。
The return value is void because ClientResponse is deprecated since RestEasy introduced JAX-RS 2.0 in version 3+.
返回值为void,因为不推荐使用ClientResponse,因为RestEasy在版本3+中引入了JAX-RS 2.0。
To return the location of the new created object i inject the response, using the @Context
annotation, and add the Content-Location header.
要返回新创建对象的位置,请使用@Context注释注入响应,然后添加Content-Location标头。
For example:
Shared Interface:
@Path("/")
@Consumes("application/xml")
@Produces("application/xml")
interface Resource {
@Path("createSomething")
void createSomething(AnyObject object);
...
}
Implementation class (The Service):
实施类(服务):
class ResourceImpl {
...
@Context org.jboss.resteasy.spi.HttpResponse response;
...
@Override
void createSomething(AnyObject object) throws AnyException {
String id = service.create(object);
response.getOutputHeaders().putSingle("Content-Location",
"/createSomething/" + id);
response.setStatus(Response.Status.CREATED.getStatusCode());
}
}
The client (build with the Resteasy Proxy Framework):
客户端(使用Resteasy代理框架构建):
...
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(baseUrl);
Resource resource = (Resource) target.proxy(Resource.class);
resource.createSomething(anyObject);
...
How can i retrieve Header information (and others, like Atom Links) which has been injected by the service?
如何检索已由服务注入的标头信息(以及其他,如Atom链接)?
Is it reasonable to use client side Filters and Interceptors?
使用客户端过滤器和拦截器是否合理?
Thank You
1 个解决方案
#1
The best solution i found was to use a Filter to process the incoming response header.
我发现的最佳解决方案是使用Filter来处理传入的响应头。
public class HeaderFilter implements ClientResponseFilter {
private Map<String, String> headers = new HashMap<>();
private List<String> headerFilter = new ArrayList<>();
public final void addHeaderFilter(final String header) {
headerFilter.add(header);
}
public final void removeHeaderFilter(final String header) {
headerFilter.remove(header);
}
public final String getHeader(final String header) {
return headers.get(header);
}
@Override
public final void filter(final ClientRequestContext requestContext,
final ClientResponseContext responseContext)
throws IOException {
headers = new HashMap<>();
for (String headerToLookFor : headerFilter) {
String header = responseContext.getHeaderString(headerToLookFor);
if (header != null) {
headers.put(headerToLookFor, header);
} else {
...
}
}
}
}
#1
The best solution i found was to use a Filter to process the incoming response header.
我发现的最佳解决方案是使用Filter来处理传入的响应头。
public class HeaderFilter implements ClientResponseFilter {
private Map<String, String> headers = new HashMap<>();
private List<String> headerFilter = new ArrayList<>();
public final void addHeaderFilter(final String header) {
headerFilter.add(header);
}
public final void removeHeaderFilter(final String header) {
headerFilter.remove(header);
}
public final String getHeader(final String header) {
return headers.get(header);
}
@Override
public final void filter(final ClientRequestContext requestContext,
final ClientResponseContext responseContext)
throws IOException {
headers = new HashMap<>();
for (String headerToLookFor : headerFilter) {
String header = responseContext.getHeaderString(headerToLookFor);
if (header != null) {
headers.put(headerToLookFor, header);
} else {
...
}
}
}
}