Spring restful API,是不是有像路由器一样使用的方法来获取其他方法端点或 URL?

Posted

技术标签:

【中文标题】Spring restful API,是不是有像路由器一样使用的方法来获取其他方法端点或 URL?【英文标题】:Spring restful API, is there a method being used like router to get other method's end points or URL?Spring restful API,是否有像路由器一样使用的方法来获取其他方法端点或 URL? 【发布时间】:2018-10-04 17:21:40 【问题描述】:
@RequestMapping("/accounts")
public class controller 
    @GetMapping("/get/id")
    public final ResponseEntity<?> getHandler()
    
    @PostMapping(value = "/create")
    public final ResponseEntity<?> createHandler()
    /*
     trying to use some spring library methods to get the url string of 
     '/accounts/get/id' instead of manually hard coding it 
    */
    

这是模拟代码,现在我在createHandler中,完成创建后,我想返回一个包含URL字符串的标题,但我不想手动连接这个URL字符串('/accounts/get /id') 这是方法getHandler() 的终点,所以我想知道是否有一种方法可以用来实现这一目标?我知道request.getRequestURI(),但这仅适用于当前上下文中的 URI。

更多解释:如果有一些库或框架实现了路由:

Routes.Accounts.get(1234)

返回帐户获取的 URL

/api/accounts/1234

【问题讨论】:

【参考方案1】:

这个想法是,您不需要指定 getcreate(动词在 REST 中是一个很大的禁忌)。

想象一下:

@RequestMapping("/accounts")
public class controller 
    @GetMapping("/id")
    public final ResponseEntity<?> getHandler(@PathVariable("id") String id) 
        //just to illustrate
        return complicatedHandlerCalculation(id).asResponse();
    

    @PostMapping
    public final ResponseEntity<?> createHandler() 
        //return a 204 Response, containing the URI from getHandler, with id resolved to the id from your database (or wherever).
    

这可以像HTTP-GET: /api/accounts/1HTTP-POST: /api/accounts 一样访问,后者将返回/api/accounts/2 的URI(可以使用HTTP-GET 获得或使用HTTP-PUT 更新/修改)

要解析此 URI,您可以像 Jersey 一样使用反射并评估相应类/方法上的注释。

Spring 等价物可以是:

// Controller requestMapping
String controllerMapping = this.getClass().getAnnotation(RequestMapping.class).value()[0];

//Method requestMapping
String methodMapping = new Object().getClass().getEnclosingMethod().getAnnotation(GetMapping.class).value()[0];

取自How do i get the requestmapping value in the controller?

【讨论】:

那是一个解决方案,但情况是我只知道方法名,我想从哪里获取请求映射url,不知道GetMapping之类的注解的索引是多少或 RequestMapping 在这个类。所以我想知道是否有像一些JS库这样的路由器可以用于注册所有方法名称和端点,之后,我可以调用它来通过方法名称获取url,比如Routes.Accounts.get(1234),它返回URL帐户获得/api/accounts/1234 你想要这个吗? docs.oracle.com/javase/1.5.0/docs/api/java/lang/… 这样您就可以按名称获得一个方法。 (可能已经过时,但我认为仍然有效)

以上是关于Spring restful API,是不是有像路由器一样使用的方法来获取其他方法端点或 URL?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 保护 REST API

Spring Boot REST API - 请求超时?

Spring Boot REST API 自动化测试

通过 Spring 进行 RESTful 身份验证

Spring REST API,响应中的自定义实体字段

如何在 Spring Boot REST API 中启用对 JSON / Jackson @RequestBody 的严格验证?