繁体   English   中英

客户端如何调用 Spring 数据 Rest 端点?

[英]How can a client call Spring Data Rest endpoints?

I have Spring Boot web application with a UI built using HTML / CSS / JavaScript. 我有另一个 Spring 引导应用程序,它公开 Spring 数据 Rest 端点。 这两个应用程序都在 Eureka 服务注册表中注册。

我希望 UI 应用程序调用另一个应用程序的 rest 端点之一。 它将使用数据填充 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 数据 Rest cars端点而不对 URL 进行硬编码并避免 403?

1. CORS 403 问题

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

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

或存储库 rest controller

@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链接获取href

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM