我有以下三种REST API方法:
@RequestMapping(value = "/{name1}", method = RequestMethod.GET)
public Object retrieve(@PathVariable String name1) throws UnsupportedEncodingException {
return configService.getConfig("frontend", name1);
}
@RequestMapping(value = "/{name1}/{name2}", method = RequestMethod.GET)
public Object retrieve(@PathVariable String name1, @PathVariable String name2) throws UnsupportedEncodingException {
return configService.getConfig("frontend", name1, name2);
}
@RequestMapping(value = "/{name1}/{name2}/{name3}", method = RequestMethod.GET)
public Object retrieve(@PathVariable String name1, @PathVariable String name2, @PathVariable String name3) {
return configService.getConfig("frontend", name1, name2,name3);
}
getConfig方法配置为接受多个参数,如:
public Object getConfig(String... names) {
我的问题是:是否可以仅使用一个方法/ RequestMapping来实现上述RequestMapping?
感谢。
答案 0 :(得分:3)
简单方法
您可以在映射中使用/**
来获取任何URL,然后从映射路径中提取所有参数。 Spring有一个常量,允许您从HTTP请求中获取路径。您只需删除映射中不必要的部分并拆分其余部分以获取参数列表。
import org.springframework.web.servlet.HandlerMapping;
@RestController
@RequestMapping("/somePath")
public class SomeController {
@RequestMapping(value = "/**", method = RequestMethod.GET)
public Object retrieve(HttpServletRequest request) {
String path = request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
String[] names = path.substring("/somePath/".length()).split("/");
return configService.getConfig("frontend", names);
}
}
更好的方法
但是,路径变量应该用于识别应用程序中的资源,而不是用作给定资源的参数。在这种情况下,建议坚持使用简单的请求参数。
http://yourapp.com/somePath?name=value1&name=value2
您的映射处理程序看起来会更简单:
@RequestMapping(method = RequestMethod.GET)
public Object retrieve(@RequestParam("name") String[] names) {
return configService.getConfig("frontend", names);
}
答案 1 :(得分:2)
您应该使用@RequestParam而不是方法POST来实现您想要的效果。
@RequestMapping(name = "/hi", method = RequestMethod.POST)
@ResponseBody
public String test(@RequestParam("test") String[] test){
return "result";
}
然后你这样发帖:
因此,您的字符串数组将包含两个值
同样在REST中,路径对应于资源,因此您应该问自己“我正在暴露的资源是什么?”。它可能类似于/ config / frontend,然后通过请求参数和/或HTTP动词指定您的选项
答案 2 :(得分:1)
您可以使用request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)
检索完整路径,然后解析它以获取所有值。
答案 3 :(得分:1)
这应该有效:
@SpringBootApplication
@Controller
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping(value ={"/{name1}","/{name1}/{name2}","/{name1}/{name2}/{name3}"})
public @ResponseBody String testMethod(
@PathVariable Map<String,String> pathvariables)
{
return test(pathvariables.values().toArray(new String[0]));
}
private String test (String... args) {
return Arrays.toString(args);
}
}