如何在RestEasy客户端中获取响应头?

时间:2020-12-27 23:32:05

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 {

              ...
          }
      }
  }
}