簡體   English   中英

REST調用標題列表

[英]REST Call with list of headers

我有以下用於調用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);
}

我找到了一個使用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);

我正在尋找這樣的解決方案。 但上面的代碼不起作用。 尋找建議。

不完全確定你的意思,但如果你想得到所有標題怎么樣:

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), ...);

難道你不能只注入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");
    ...

當然,這樣你就可以在實現中隱藏部分合同。

您可以將MultivaluedHashMap(javax.ws.rs.core.MultivaluedHashMap)中設置的所有標頭發送到表單。 這是Form的可接受的構造函數參數。

    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如下,

Response evaluateChange(
        @Form MultivaluedMap headers,
        @Context HttpServletResponse response, Request request);

希望這有幫助,祝你好運 !!

不確定為什么要嘗試Map而不僅僅是List

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

現在我沒有對此進行測試,但這需要將所有HeaderParams稱為“HEADER”,並且它們將/應該按照出現的順序存儲在List<String>中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM