2014-12-04 95 views
1

使用REST API创建或列出项目时,我也返回整个资源路径。Spring MVC请求映射 - 完整请求URI

例如创建人员记录返回http://service:9000/person/1234作为回应。为了获得架构,主机&端口部分像http://service:9000,我从URL获取的HttpServletRequest.getRequestURL()

示例(不是生产代码,但在概念上相同):

@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 
} 

由于这是一个相当锅炉板代码重复每一个方法,如果春节不具备这里面躲避我的时候支持我想知道读它的文档。

通过这个我的意思是访问任何URL没有requiredn HttpServletRequest或甚至更好它的架构,主机,端口部分只。

+0

你能更新,以显示您正在使用的URL做什么的? – 2014-12-04 11:39:04

+0

如果是为了认真的工作,**谨慎**:在现实世界中,由于反向代理背后的安全原因,应用服务器通常是隐藏的:应用服务器已知的主机端口是**而不是用户使用的端口。反向代理尽最大努力应对,但要警惕空洞...... – 2014-12-04 13:56:06

回答

2

您可以在拦截器中构建URI(它在控制器方法之前执行)并将其作为属性并将其用于控制​​器方法中。

+0

您能否提供一些链接,其中包含要查找拦截器或关键字的示例? – 2014-12-04 12:47:08

+0

拦截器的示例:http://www.mkyong.com/spring-mvc/spring-mvc-handler-interceptors-example/ 拦截器是一个包含两个方法preHandle和postHandle的类,您可以使用它拦截请求添加标题,检索url或uri ...任何你想要的。它在级联控制器方法之前执行(可以使用多个) – Emilio 2014-12-04 14:41:39

3

该文档提供了许多使用UriComponentsBuilder构建URI的examples

此外,如果您希望将REST API提升到新的水平,我建议您查看Spring HATEOAS

顺便说一句:PUT意味着你替换资源,在这里不是这种情况。您可以发布到/person或发送给该人自己的URI,例如/person/1234

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 

} 
1

您可以使用org.springframework.web.servlet.support.ServletUriComponentsBuilder这样的:

String uri = ServletUriComponentsBuilder.fromCurrentRequest() 
    .replacePath("/person/{id}") 
    .buildAndExpand(id) 
    .toUriString();