客户端如何调用 Spring Data Rest 端点?

How can a client call Spring Data Rest endpoints?

我有 Spring 使用 UI 使用 HTML / CSS / JavaScript 构建的引导 Web 应用程序。我有另一个 Spring 启动应用程序,它公开了 Spring Data Rest 端点。这两个应用程序都在 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 是硬编码的,而不是从服务注册表中查找的。

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

1。 CORS 403 期

根据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。硬编码 URL 问题

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

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

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

cars link

得到 href