spring3 的restful API RequestMapping介绍
spring3 的restful API RequestMapping介绍在spring mvc中 @RequestMapping是把web请求映射到controller的方法上。1.RequestMapping Basic Example 将http请求映射到controller方法的最直接方式1.1 @RequestMapping by Path @RequestMapping(value = "/foos")@ResponseBodypublic String getFoosBySimplePath() {return "Get some Foos";}可以通过下面的方式测试: curl -i http://localhost:8080/springmvc/foos1.2 @RequestMapping – the HTTP Method,我们可以加上http方法的限制@RequestMapping(value = "/foos", method = RequestMethod.POST)@ResponseBodypublic String postFoos() {return "Post some Foos";}可以通过curl i -X POST http://localhost:8080/springmvc/foos测试。2.RequestMapping 和http header2.1 @RequestMapping with the headers attribute 当request的header包含某个key value值时@RequestMapping(value = "/foos", headers = "key=val")@ResponseBodypublic String getFoosWithHeader() {return "Get some Foos with Header";} header多个字段满足条件时 @RequestMapping(value = "/foos", headers = { "key1=val1", "key2=val2" })@ResponseBodypublic String getFoosWithHeaders() {return "Get some Foos with Header";}通过curl -i -H "key:val" http://localhost:8080/springmvc/foos 测试。2.2 @RequestMapping 和Accept头@RequestMapping(value = "/foos", method = RequestMethod.GET, headers = "Accept=application/json")@ResponseBodypublic String getFoosAsJsonFromBrowser() {return "Get some Foos with Header Old";}支持accept头为json的请求,通过curl -H "Accept:application/json,text/html" http://localhost:8080/springmvc/foos测试在spring3.1中@RequestMapping注解有produces和 consumes 两个属性来代替accept头@RequestMapping(value = "/foos", method = RequestMethod.GET, produces = "application/json")@ResponseBodypublic String getFoosAsJsonFromREST() {return "Get some Foos with Header New";}同样可以通过curl -H "Accept:application/json" http://localhost:8080/springmvc/foos测试produces可以支持多个@RequestMapping(value = "/foos", produces = { "application/json", "application/xml" })当前不能有两个方法同时映射到同一个请求,要不然会出现下面这个异常Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'fooController' bean methodpublic java.lang.String org.baeldung.spring.web.controller.FooController.getFoosAsJsonFromREST()to {[/foos],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}: There is already 'fooController' bean methodpublic java.lang.String org.baeldung.spring.web.controller.FooController.getFoosAsJsonFromBrowser() mapped.3.RequestMapping with Path Variables3.1我们可以把@PathVariable把url映射到controller方法单个@PathVariable参数映射@RequestMapping(value = "/foos/{id}")@ResponseBodypublic String getFoosBySimplePathWithPathVariable(@PathVariable("id") long id) { return "Get a specific Foo with id=" + id;}通过curl http://localhost:8080/springmvc/foos/1试试如果参数名跟url参数名一样,可以省略为@RequestMapping(value = "/foos/{id}")@ResponseBodypublic String getFoosBySimplePathWithPathVariable(@PathVariable String id) { return "Get a specific Foo with id=" + id;}3.2 多个@PathVariable @RequestMapping(value = "/foos/{fooid}/bar/{barid}")@ResponseBodypublic String getFoosBySimplePathWithPathVariables(@PathVariable long fooid, @PathVariable long barid) {return "Get a specific Bar with id=" + barid + " from a Foo with id=" + fooid;}通过curl http://localhost:8080/springmvc/foos/1/bar/2测试。3.3支持正则的@PathVariable @RequestMapping(value = "/bars/{numericId:[\\d]+}")@ResponseBodypublic String getBarsBySimplePathWithPathVariable(@PathVariable final long numericId) {return "Get a specific Bar with id=" + numericId;}这个url匹配:http://localhost:8080/springmvc/bars/1不过这个不匹配:http://localhost:8080/springmvc/bars/abc4.RequestMapping with Request Parameters我们可以使用 @RequestParam注解把请求参数提取出来比如url:http://localhost:8080/springmvc/bars?id=100@RequestMapping(value = "/bars")@ResponseBodypublic String getBarBySimplePathWithRequestParam(@RequestParam("id") long id) {return "Get a specific Bar with id=" + id;}我们可以通过RequestMapping定义参数列表@RequestMapping(value = "/bars", params = "id")@ResponseBodypublic String getBarBySimplePathWithExplicitRequestParam(@RequestParam("id") long id) {return "Get a specific Bar with id=" + id;}和@RequestMapping(value = "/bars", params = { "id", "second" })@ResponseBodypublic String getBarBySimplePathWithExplicitRequestParams(@RequestParam("id") long id) {return "Narrow Get a specific Bar with id=" + id;}比如http://localhost:8080/springmvc/bars?id=100&second=something会匹配到最佳匹配的方法上,这里会映射到下面这个。5.RequestMapping Corner Cases5.1 @RequestMapping多个路径映射到同一个controller的同一个方法@RequestMapping(value = { "/advanced/bars", "/advanced/foos" })@ResponseBodypublic String getFoosOrBarsByPath() {return "Advanced - Get some Foos or Bars";}下面这两个url会匹配到同一个方法curl -i http://localhost:8080/springmvc/advanced/fooscurl -i http://localhost:8080/springmvc/advanced/bars5.2@RequestMapping 多个http方法 映射到同一个controller的同一个方法@RequestMapping(value = "/foos/multiple", method = { RequestMethod.PUT, RequestMethod.POST })@ResponseBodypublic String putAndPostFoos() {return "Advanced - PUT and POST within single method";}下面这两个url都会匹配到上面这个方法curl -i -X POST http://localhost:8080/springmvc/foos/multiplecurl -i -X PUT http://localhost:8080/springmvc/foos/multiple5.3@RequestMapping 匹配所有方法@RequestMapping(value = "*")@ResponseBodypublic String getFallback() {return "Fallback for GET Requests";}匹配所有方法@RequestMapping(value = "*", method = { RequestMethod.GET, RequestMethod.POST ... })@ResponseBodypublic String allFallback() {return "Fallback for All Requests";}6.Spring Configurationcontroller的annotation@Controllerpublic class FooController { ... }spring3.1@Configuration@EnableWebMvc@ComponentScan({ "org.baeldung.spring.web.controller" })public class MvcConfig {//}可以从这里看到所有的示例https://github.com/eugenp/tutorials/tree/master/springmvc