【问题标题】:How to get the response header in a RestEasy client?如何在 RestEasy 客户端中获取响应标头?
【发布时间】:2015-05-08 12:51:15
【问题描述】:

我正在使用 Jax-RS 2.0 (Resteasy 3.0.7.Final) 实现一个 Restful 服务,并在客户端和服务之间共享接口。

返回值是无效的,因为自从 RestEasy 在版本 3+ 中引入 JAX-RS 2.0 以来,ClientResponse 已被弃用。

为了返回新创建对象的位置,我使用@Context 注解注入响应,并添加 Content-Location 标头。

例如:

共享接口:

   @Path("/")
   @Consumes("application/xml")
   @Produces("application/xml")
   interface Resource {

        @Path("createSomething")
        void createSomething(AnyObject object);

        ...
   }

实现类(服务):

    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());
         }

    }

客户端(使用 Resteasy 代理框架构建):

     ...
     ResteasyClient client = new ResteasyClientBuilder().build();
     ResteasyWebTarget target = client.target(baseUrl);

     Resource resource = (Resource) target.proxy(Resource.class);   

     resource.createSomething(anyObject);
     ...

如何检索服务注入的 Header 信息(以及其他信息,例如 Atom Links)?

使用客户端过滤器和拦截器是否合理?

谢谢

【问题讨论】:

    标签: java rest jax-rs resteasy


    【解决方案1】:

    我找到的最佳解决方案是使用过滤器来处理传入的响应标头。

    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 {
    
                  ...
              }
          }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2011-10-19
      • 1970-01-01
      • 2020-09-02
      • 2022-11-17
      • 2019-08-05
      相关资源
      最近更新 更多