【问题标题】:How to create a URL pointing to a REST endpoint in your system at runtime with Spring Boot?如何使用 Spring Boot 在运行时创建指向系统中 REST 端点的 URL?
【发布时间】:2019-08-19 11:42:40
【问题描述】:

我正在使用 Spring Boot 构建 REST API。在我的情况下,有 2 个控制器:ExportControllerImportController。请在此处查看示例代码:

导出控制器:

@RestController
public class ExportController {

    @GetMapping(value = "/export", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<Resource> export(@RequestParam("id") String id) {
        // Processing...
    }

}

导入控制器:

@RestController
public class ImportController {

    @PostMapping(value = "/import", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> importData(HttpServletRequest request) {
        // Processing...

       // What should I do here?
       String url = ...
    }

}

在我的ImportController 中,我想生成一个指向/export 端点的URL,例如http://www.example.com/export?id=1234.

我没有在application.properties 中配置有关主机或端口的任何内容。我想在运行时获取它们。

你能告诉我如何实现它吗?我在互联网上搜索了很多,但找不到答案。感谢您的帮助。

【问题讨论】:

标签: java spring rest spring-boot


【解决方案1】:

如果您可以将spring-hateoas 带入您的项目,那么这将起作用:

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;

@RestController
public class ImportController {

    @PostMapping(value = "/import", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> importData(HttpServletRequest request) {
        String someId = "1234";

        ControllerLinkBuilder linkBuilder = ControllerLinkBuilder.linkTo(methodOn(ExportController.class).export(someId));

        URI uri = linkBuilder.toUri();

        return ResponseEntity.ok(uri);
    }

}

这会产生http://localhost:8080/export?id=1234

【讨论】:

  • 有趣!我不知道这个。我会查一下。谢谢!
【解决方案2】:
@RestController
public class ImportController {
    @PostMapping(value = "/import", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> importData(HttpServletRequest request) {
        // Processing...

       String url = request.getScheme() + "://" + 
            request.getServerName() + ":" +                           
            request.getServerPort() + "/export";
    }
}

【讨论】:

    【解决方案3】:

    您可以使用Spring framework 自带的ServletUriComponentsBuilder,因为3.1.RELEASE

    鉴于您有权访问当前请求,您可以执行以下操作。

     UriComponents uriComponents = ServletUriComponentsBuilder
            .fromRequest(httpServletRequest)
            .replacePath("/export")
            .queryParam("id",1234)
            .build();
     String url = uriComponents.toUri();
    

    【讨论】:

    • 嗨,我不想硬编码字符串“/export”,而是在运行时读取它。
    • @TrietDoan,我明白你的意思。但是在您的代码中的某处将有一个带有RequestMapping 注释的ImportController 具有硬编码的path 值。您始终可以将这些路径值移动到静态字符串常量并在其他任何地方使用它。
    猜你喜欢
    • 2023-04-02
    • 2020-05-02
    • 2020-10-02
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2020-03-03
    相关资源
    最近更新 更多