[英]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.