POST REST 服务的复杂参数会请求什么 URL 和 Body 看起来像
POST complex parameters to REST service what would request URL and Body look like
所以我站起来休息一下。它将向非常复杂的资源请求 post。实际后端需要多个(19 个!)参数。其中之一是字节数组。听起来这需要由客户端序列化并发送到我的服务。
我正在尝试了解如何正确处理此问题的方法。我在想这样的事情
@POST
@Path("apath")
@Consumes(MediaType.APPLICATION_JSON, MediaType.TEXT_HTML)
public Response randomAPI(@Parameter apiID, WhatParamWouldIPutHere confused){
}
我将使用哪些参数类型来捕获入站(序列化)Post 数据。客户端 URI 会是什么样子?
为了获得请求的所有参数,您可以使用 @Context UriInfo
作为 randomAPI
方法的参数。
然后使用UriInfo#getQueryParameters()
得到完整的MultivaluedMap
参数。
如果您希望将 MultivaluedMap
转换为简单的 HashMap
,我也为此添加了代码。
所以你的方法基本上看起来像这样:
@POST
@Path("apath")
@Consumes(MediaType.APPLICATION_JSON, MediaType.TEXT_HTML)
public Response randomAPI(@Context UriInfo uriInfo){
Map params= (HashMap) convertMultiToHashMap(uriInfo.getQueryParameters());
return service.doWork(params);
}
public Map<String, String> convertMultiToHashMap(MultivaluedMap<String, String> m) {
Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, List<String>> entry : m.entrySet()) {
StringBuilder sb = new StringBuilder();
for (String s : entry.getValue()) {
sb.append(s);
}
map.put(entry.getKey(), sb.toString());
}
return map;
}
附加信息:
The @Context
annotation allows you to inject instances of
javax.ws.rs.core.HttpHeaders
, javax.ws.rs.core.UriInfo
,
javax.ws.rs.core.Request
, javax.servlet.HttpServletRequest
,
javax.servlet.HttpServletResponse
, javax.servlet.ServletConfig
,
javax.servlet.ServletContext
, and javax.ws.rs.core.SecurityContext
objects.
我的想法是你可以简单地使用 httpservlet 请求,所有参数都可以检索如下
@RequestMapping(value = "/yourMapping", method = RequestMethod.POST)
public @ResponseBody String yourMethod(HttpServletRequest request) {
Map<String, String[]> params = request.getParameterMap();
//Loop through the parameter maps and get all the paramters one by one including byte array
for(String key : params){
if(key == "file"){ //This param is byte array/ file data, specially handle it
byte[] content = params.get(key);
//Do what ever you want with the byte array
else if(key == "any of your special params") {
//handle
}
else {
}
}
}
所以我站起来休息一下。它将向非常复杂的资源请求 post。实际后端需要多个(19 个!)参数。其中之一是字节数组。听起来这需要由客户端序列化并发送到我的服务。
我正在尝试了解如何正确处理此问题的方法。我在想这样的事情
@POST
@Path("apath")
@Consumes(MediaType.APPLICATION_JSON, MediaType.TEXT_HTML)
public Response randomAPI(@Parameter apiID, WhatParamWouldIPutHere confused){
}
我将使用哪些参数类型来捕获入站(序列化)Post 数据。客户端 URI 会是什么样子?
为了获得请求的所有参数,您可以使用 @Context UriInfo
作为 randomAPI
方法的参数。
然后使用UriInfo#getQueryParameters()
得到完整的MultivaluedMap
参数。
如果您希望将 MultivaluedMap
转换为简单的 HashMap
,我也为此添加了代码。
所以你的方法基本上看起来像这样:
@POST
@Path("apath")
@Consumes(MediaType.APPLICATION_JSON, MediaType.TEXT_HTML)
public Response randomAPI(@Context UriInfo uriInfo){
Map params= (HashMap) convertMultiToHashMap(uriInfo.getQueryParameters());
return service.doWork(params);
}
public Map<String, String> convertMultiToHashMap(MultivaluedMap<String, String> m) {
Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, List<String>> entry : m.entrySet()) {
StringBuilder sb = new StringBuilder();
for (String s : entry.getValue()) {
sb.append(s);
}
map.put(entry.getKey(), sb.toString());
}
return map;
}
附加信息:
The
@Context
annotation allows you to inject instances ofjavax.ws.rs.core.HttpHeaders
,javax.ws.rs.core.UriInfo
,javax.ws.rs.core.Request
,javax.servlet.HttpServletRequest
,javax.servlet.HttpServletResponse
,javax.servlet.ServletConfig
,javax.servlet.ServletContext
, andjavax.ws.rs.core.SecurityContext
objects.
我的想法是你可以简单地使用 httpservlet 请求,所有参数都可以检索如下
@RequestMapping(value = "/yourMapping", method = RequestMethod.POST)
public @ResponseBody String yourMethod(HttpServletRequest request) {
Map<String, String[]> params = request.getParameterMap();
//Loop through the parameter maps and get all the paramters one by one including byte array
for(String key : params){
if(key == "file"){ //This param is byte array/ file data, specially handle it
byte[] content = params.get(key);
//Do what ever you want with the byte array
else if(key == "any of your special params") {
//handle
}
else {
}
}
}