我有以下用于调用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);
}
答案 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
);
}
中。