Java 将复杂参数发布到REST服务,请求URL和正文是什么样子的

Java 将复杂参数发布到REST服务,请求URL和正文是什么样子的,java,rest,resteasy,Java,Rest,Resteasy,所以我要做一个休息服务。它将向一个相当复杂的资源请求一个post。实际后端需要多个(19!)参数。其中之一是字节数组。听起来这需要由客户端序列化并发送到我的服务 我正在试图理解我如何才能正确地处理这个问题。我是这样想的 @POST @Path("apath") @Consumes(MediaType.APPLICATION_JSON, MediaType.TEXT_HTML) public Response randomAPI(@Parameter apiID, WhatParamWouldIP

所以我要做一个休息服务。它将向一个相当复杂的资源请求一个post。实际后端需要多个(19!)参数。其中之一是字节数组。听起来这需要由客户端序列化并发送到我的服务

我正在试图理解我如何才能正确地处理这个问题。我是这样想的

@POST
@Path("apath")
@Consumes(MediaType.APPLICATION_JSON, MediaType.TEXT_HTML)
public Response randomAPI(@Parameter apiID, WhatParamWouldIPutHere confused){
}

我将使用哪些参数类型来捕获入站(序列化)Post数据。客户端URI是什么样子的?

为了获得请求的所有参数,您可以使用
@Context-UriInfo
作为
随机API
方法的参数

然后使用获取参数的完整
多值map

如果您希望将
多值映射
转换为简单的
哈希映射
,我也添加了相应的代码

因此,您的方法基本上如下所示:

@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;
    }
@POST
@路径(“磷灰石”)
@使用(MediaType.APPLICATION\u JSON、MediaType.TEXT\u HTML)
公共响应随机API(@Context-UriInfo-UriInfo){
Map params=(HashMap)convertMultiToHashMap(uriInfo.getQueryParameters());
返回服务。doWork(参数);
}
公共地图转换器MultiToHashMap(多值地图m){
Map Map=newhashmap();
对于(Map.Entry:m.entrySet()){
StringBuilder sb=新的StringBuilder();
对于(字符串s:entry.getValue()){
某人追加;
}
map.put(entry.getKey(),sb.toString());
}
返回图;
}
其他信息:

@Context
注释允许您注入
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
javax.ws.rs.core.SecurityContext
对象


为了获得请求的所有参数,您可以使用
@Context-UriInfo
作为
randomAPI
方法的参数

然后使用获取参数的完整
多值map

如果您希望将
多值映射
转换为简单的
哈希映射
,我也添加了相应的代码

因此,您的方法基本上如下所示:

@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;
    }
@POST
@路径(“磷灰石”)
@使用(MediaType.APPLICATION\u JSON、MediaType.TEXT\u HTML)
公共响应随机API(@Context-UriInfo-UriInfo){
Map params=(HashMap)convertMultiToHashMap(uriInfo.getQueryParameters());
返回服务。doWork(参数);
}
公共地图转换器MultiToHashMap(多值地图m){
Map Map=newhashmap();
对于(Map.Entry:m.entrySet()){
StringBuilder sb=新的StringBuilder();
对于(字符串s:entry.getValue()){
某人追加;
}
map.put(entry.getKey(),sb.toString());
}
返回图;
}
其他信息:

@Context
注释允许您注入
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
javax.ws.rs.core.SecurityContext
对象


我的想法是,您可以简单地使用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 {
            }

          }
}
@RequestMapping(value=“/yourMapping”,method=RequestMethod.POST)
public@responseBy字符串yourMethod(HttpServletRequest){
Map params=request.getParameterMap();
//循环遍历参数映射并逐个获取所有参数,包括字节数组
for(字符串键:params){
如果(key==“file”){//此参数是字节数组/文件数据,请专门处理它
字节[]内容=params.get(键);
//可以对字节数组执行任何操作
否则,如果(键==“您的任何特殊参数”){
//处理
}
否则{
}
}
}

我的想法是,您只需使用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 {
            }

          }
}
@RequestMapping(value=“/yourMapping”,method=RequestMethod.POST)
public@responseBy字符串yourMethod(HttpServletRequest){
Map params=request.getParameterMap();
//循环遍历参数映射并逐个获取所有参数,包括字节数组
for(字符串键:params){
如果(key==“file”){//此参数是字节数组/文件数据,请专门处理它
字节[]内容=params.get(键);
//可以对字节数组执行任何操作
否则,如果(键==“您的任何特殊参数”){
//处理
}
否则{
}
}
}

Server/Java-side,Spring中的一个常见模式是创建自己的类,该类包含您描述的所有参数,然后当JSON命中该方法时映射到该类。例如,您的
MyClass
将为
字符串someProperty1
int otherQuantity
和POST数据参数设置setters/getterd需要有相同的名称-
{someProperty1:“hello world”,otherQuantity:45}
听起来类似于我在RESTeasy中要做的事情这是一个REST端点?它服务于请求并响应??请澄清这是一个REST端点。用户将通过一个非常复杂的请求(包括字节[])发布到此端点这是第19段吗