【问题标题】:How can a client call Spring Data Rest endpoints?客户端如何调用 Spring Data Rest 端点?
【发布时间】:2021-06-03 21:49:52
【问题描述】:

我有一个带有使用 HTML / CSS / JavaScript 构建的 UI 的 Spring Boot Web 应用程序。我有另一个公开 Spring Data Rest 端点的 Spring Boot 应用程序。这两个应用程序都在 Eureka 服务注册表中注册。

我希望 UI 应用程序调用另一个应用程序的其余端点之一。它将使用数据填充 HTML 页面上的下拉框。为此,我试图让 JavaScript 通过Traverson 直接调用 REST API:

traverson.registerMediaType(TraversonJsonHalAdapter.mediaType, 
         TraversonJsonHalAdapter);

traverson
        .from("http://spring-data-rest-server:8081/api/cars")
        .jsonHal()
        .newRequest()
        .follow(list)
        .getResource(...

这种方法有两个问题:

  1. UI 收到 403 声明 strict-origin-when-cross-origin
  2. URL 是硬编码的,而不是从服务注册表中查找的。​​li>

如何让 Traverson 调用 Spring Data Rest cars 端点而不对 URL 进行硬编码并避免 403?

【问题讨论】:

    标签: javascript spring spring-boot spring-data-rest


    【解决方案1】:

    1。 CORS403问题

    根据spring data rest doc,您可以在存储库接口上配置CORS

    @CrossOrigin(origins = "http://domain2.example",
      methods = { RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE },
      maxAge = 3600)
    interface PersonRepository extends CrudRepository<Person, Long> {}
    

    或存储库休息控制器

    @RepositoryRestController
    public class PersonController {
    
      @CrossOrigin(maxAge = 3600)
      @RequestMapping(path = "/people/xml/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
      public Person retrieve(@PathVariable Long id) {
        // …
      }
    }
    

    或全局

    @Component
    public class SpringDataRestCustomization implements RepositoryRestConfigurer {
    
      @Override
      public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
    
        cors.addMapping("/person/**")
          .allowedOrigins("http://domain2.example")
          .allowedMethods("PUT", "DELETE")
          .allowedHeaders("header1", "header2", "header3")
          .exposedHeaders("header1", "header2")
          .allowCredentials(false).maxAge(3600);
      }
    }
    

    2。硬编码网址问题

    2.1。从服务注册表中获取主机和端口。路径片段/api 可能会被硬编码或设置在服务注册表端,因为它是您设置的约定。

    2.2。 Traverson 调用http://host:port/api,那么你应该有一个响应体

    { 
      "_links" : {
        "cars" : {
          "href" : "http://spring-data-rest-server:8081/api/cars"
        }
      }
    }
    

    cars 链接获取href

    【讨论】:

    • 谢谢。在 2.1 中,您如何建议 JavaScript 代码使用 JavaScript 从服务注册中心获取主机和端口?
    • 这取决于您使用的服务注册表。 Google javascript + that service registry name 应该会找到 javascript 库
    • 好的。我使用尤里卡。我做了一个谷歌搜索,但一切都是关于 NodeJS 的。我没有使用 NodeJS,也不想将我的 JavaScript 客户端注册为 Eureka 服务。我只想查找 Spring Data Rest 服务器的 URL。我不知道该怎么做。也许,我只需要在 UI 应用程序上编写另一个 Spring 控制器,将 URL 返回到 Spring Data Rest 服务器。
    猜你喜欢
    • 2019-02-06
    • 2017-12-21
    • 2013-10-30
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多