2014-12-04 140 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();