REST调用标题列表

时间:2016-01-25 16:33:49

标签: java rest http-headers client

我有以下用于调用rest调用的代码片段。我有大约8个标题要传递给这个休息电话。但问题是难以管理。如果以后会增加标头列表,我需要更改evaluateChange方法签名,以便将其他标头包含为方法params

@Path("/v1/restclienturi/")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public interface RestClient {

    @POST
    @Path("/samplecall/evaluate")
    Response evaluateChange(
            @HeaderParam("HEADER1") String header1,
            @HeaderParam("HEADER2") String header2,
            @HeaderParam("HEADER3") String header3,
            @HeaderParam("HEADER4") String header4,
            @HeaderParam("HEADER5") String header5,
            @HeaderParam("HEADER6") String header6,
            @HeaderParam("HEADER7") String header7,
            @HeaderParam("HEADER8") String header8,
            @Context HttpServletResponse response, Request request);
}

请提供您的想法或代码段以适应此情况。

我尝试了以下代码片段,但它不起作用(其中headerMap包含其中的所有8个标头):

@Path("/v1/restclienturi/")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public interface RestClient {

    @POST
    @Path("/samplecall/evaluate")
    Response evaluateChange(
            @RequestHeader Map<String, String> headerMap,
            @Context HttpServletResponse response, Request request);
}

5 个答案:

答案 0 :(得分:4)

我找到了一个使用javax.ws.rs.core.Form的解决方案:

 @Path("/v1/restclienturi/")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public interface RestClient {

    @POST
    @Path("/samplecall/evaluate")
    Response evaluateChange(
            @Form MyHeader headers,
            @Context HttpServletResponse response, Request request);
}

以下是MyHeader,它是一个pojo:

public class MyHeader{
@HeaderParam("HEADER1")
    private String header1;

    @HeaderParam("HEADER2")
    private String header2;
.....
// getters and setters present
}

实例化MyHeader并设置值以将其传递给REST服务,如:

MyHeader headers = new MyHeader();
headers.setHeader1("HEADER1_VALUE");
...

并致电:evaluateChange(headers, null,request);

<强>问题: 这种方法的一个非常大的问题是,每次添加新标头时,我们需要进行代码更改以设置并获取值。如果解决方案类似于作为集合传递,那么在添加新标头时我们不会涉及代码更改。像:

Map<String,String> headersMap = new HashMap();
headers.put("HEADER1","HEADER1_VALUE");
....
evaluateChange(headersMap,null,request);

我正在寻找这样的解决方案。但上面的代码不起作用。寻找建议。

答案 1 :(得分:2)

不完全确定您的意思,但如果您想获取所有标题如何:

public Response evaluateChange(@Context HttpHeaders headers, ...) {
    String header1 = headers.getRequestHeader("HEADER1").get(0);
    ...
}

在此处找到更多相关代码:http://www.mkyong.com/webservices/jax-rs/get-http-header-in-jax-rs/

编辑:如何使用键值映射调用该方法。

public class MapHttpHeaders implements HttpHeaders {
   private Map<String, String> values;

   public MapHttpHeaders(Map<String, String> values) {
      this.values = values;
   }

   @Override
   public String getHeaderString(String key) {
      return values.get(key);
   }

   @Override
   public List<String> getRequestHeader(String key) {
      String value = getHeaderString(key);
      if (value == null) {
         return null;
      } else {
         return asList(value);
      }
   }
   ...and so on...
}

然后就这样做:

evaluateChange(new MapHttpHeaders(values), ...);

答案 2 :(得分:2)

你不能注入HttpServletRequest然后使用它的getHeader(String name)方法吗?

API

@POST
@Path("/samplecall/evaluate")
Response evaluateChange(
        @RequestHeader Map<String, String> headerMap,
        @Context HttpServletResponse response, 
        @Context HttpServletRequest httpRequest,
        Request request);

默认地将Impl

@Override
public Response evaluateChange(
        @RequestHeader Map<String, String> headerMap,
        @Context HttpServletResponse response, 
        @Context HttpServletRequest httpRequest,
        Request request) {


    String header1 = httpRequest.getHeader("HEADER1");
    ...

当然,通过这种方式,您可以隐藏合同中的部分内容。

答案 3 :(得分:1)

您可以将MultivaluedHashMap(javax.ws.rs.core.MultivaluedHashMap)中设置的所有标头发送到表单。这是Form的可接受的构造函数参数。

folders

并更改您的 MultivaluedMap<String, String> headerMap = new MultivaluedHashMap<String, String>(); headersMap.putSingle("HEADER1","HEADER1_VALUE"); headersMap.putSingle("HEADER2","HEADER1_VALUE"); . . . headersMap.putSingle("HEADER8","HEADER8_VALUE"); evaluateChange(headersMap,null,request); ,如下所示

evaluateChange

希望这会有所帮助..祝你好运!

答案 4 :(得分:0)

不确定为什么要尝试CURRENT_DATE,而不仅仅是Map

List

现在我没有对此进行测试,但这需要调用所有HeaderParams&#39; HEADER&#39;,它们将/应按照发生的顺序存储在@Path("/v1/restclienturi/") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public interface RestClient { @POST @Path("/samplecall/evaluate") Response evaluateChange( @HeaderParam("HEADER") List<String> headers, @Context HttpServletResponse response, Request request ); } 中。