使用REST api创建或列出项目时,我还返回整个资源路径。
例如,创建人员记录会返回http://service:9000/person/1234
作为回应。为了获得架构,主持人和端口部分如http://service:9000
,我从HttpServletRequest.getRequestURL()
获取的URL中提取它。
示例(不是生产代码,但在概念上相同):
@RequestMapping(value = "/person", method = RequestMethod.PUT)
public Object putPerson(
@RequestParam(value = "name") String name,
HttpServletRequest req) {
long id = createPerson(name);
String uriStart = RestUtils.getSchemeHostPortUrlPart(req
.getRequestURL().toString());
String uri = uriStart + "/person/" + id;
Person person = new Person(name, id, uri);
return person; //Serialized to json by Spring & Jackson
}
//Simple bean-like class
public class Person {
//Getter methods for uri, name & id
}
由于这是一个相当于每个方法重复的锅炉板代码,我想知道Spring是否支持这个在阅读它的文档时没有得到支持。
我的意思是访问任何一个URL而不需要HttpServletRequest
,或者甚至更好地访问它的架构,主机,端口部分。
答案 0 :(得分:3)
该文档提供了大量examples,用于使用UriComponentsBuilder
构建URI。
此外,如果您想将REST API提升到新的水平,我建议您查看Spring HATEOAS。
顺便说一句:PUT意味着你要替换资源,这不是这里的情况。您可以POST到/person
或PUT到此人自己的URI,例如/person/1234
。
答案 1 :(得分:2)
您可以在拦截器中构建URI(在控制器方法之前执行)并将其作为属性放置并在控制器方法中使用它。
答案 2 :(得分:1)
我相信这很简单。看看这个例子:
@RequestMapping(value = "/person", method = RequestMethod.PUT)
public Object putPerson(@RequestParam(value = "name") String name, HttpServletRequest req) {
long id = createPerson(name);
Person person = new Person(id, name, req);
return person; //Serialized to json by Spring & Jackson
}
public class JsonResponse {
private String url;
public JsonResponse(HttpServletRequest request) {
url = request.getRequestURI() + "?" + request.getQueryString();
}
public final String url() {
return url;
}
}
public class User extends JsonResponse {
private Long id;
private String name;
public User(Long id, String name, HttpServletRequest request) {
super(request);
this.id = id;
this.name = name;
}
// Getter, Setter
}
答案 3 :(得分:1)
您可以像这样使用org.springframework.web.servlet.support.ServletUriComponentsBuilder
:
String uri = ServletUriComponentsBuilder.fromCurrentRequest()
.replacePath("/person/{id}")
.buildAndExpand(id)
.toUriString();