客户端如何调用 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(...
这种方法有两个问题:
- UI 得到一个 403 说明
strict-origin-when-cross-origin
- 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
我有 Spring 使用 UI 使用 HTML / CSS / JavaScript 构建的引导 Web 应用程序。我有另一个 Spring 启动应用程序,它公开了 Spring Data Rest 端点。这两个应用程序都在 Eureka 服务注册表中注册。
我希望 UI 应用程序调用另一个应用程序的其余端点之一。它将使用数据填充 HTML 页面上的下拉框。为此,我试图让 JavaScript 通过 Traverson:
直接调用 REST APItraverson.registerMediaType(TraversonJsonHalAdapter.mediaType,
TraversonJsonHalAdapter);
traverson
.from("http://spring-data-rest-server:8081/api/cars")
.jsonHal()
.newRequest()
.follow(list)
.getResource(...
这种方法有两个问题:
- UI 得到一个 403 说明
strict-origin-when-cross-origin
- 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