博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring3 的restful API RequestMapping介绍
阅读量:6930 次
发布时间:2019-06-27

本文共 6610 字,大约阅读时间需要 22 分钟。

spring3 的restful API RequestMapping介绍    在spring mvc中 @RequestMapping是把web请求映射到controller的方法上。    1.RequestMapping Basic Example    将http请求映射到controller方法的最直接方式  1.1 @RequestMapping  by Path         @RequestMapping(value = "/foos")      @ResponseBody      public String getFoosBySimplePath() {          return "Get some Foos";      }        可以通过下面的方式测试: curl -i http://localhost:8080/springmvc/foos    1.2 @RequestMapping – the HTTP Method,我们可以加上http方法的限制        @RequestMapping(value = "/foos", method = RequestMethod.POST)      @ResponseBody      public String postFoos() {          return "Post some Foos";      }        可以通过curl i -X POST http://localhost:8080/springmvc/foos测试。    2.RequestMapping 和http header    2.1 @RequestMapping with the headers attribute    当request的header包含某个key value值时            @RequestMapping(value = "/foos", headers = "key=val")      @ResponseBody      public String getFoosWithHeader() {          return "Get some Foos with Header";      }          header多个字段满足条件时          @RequestMapping(value = "/foos", headers = { "key1=val1", "key2=val2" })      @ResponseBody      public 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")      @ResponseBody      public 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")      @ResponseBody      public 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 method      public 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 method      public java.lang.String org.baeldung.spring.web.controller.FooController.getFoosAsJsonFromBrowser()       mapped.        3.RequestMapping with Path Variables  3.1我们可以把@PathVariable把url映射到controller方法      单个@PathVariable参数映射            @RequestMapping(value = "/foos/{id}")      @ResponseBody      public 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}")      @ResponseBody      public String getFoosBySimplePathWithPathVariable(@PathVariable String id) {         return "Get a specific Foo with id=" + id;      }  3.2 多个@PathVariable          @RequestMapping(value = "/foos/{fooid}/bar/{barid}")      @ResponseBody      public 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]+}")      @ResponseBody      public 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/abc    4.RequestMapping with Request Parameters    我们可以使用 @RequestParam注解把请求参数提取出来  比如url:http://localhost:8080/springmvc/bars?id=100        @RequestMapping(value = "/bars")      @ResponseBody      public String getBarBySimplePathWithRequestParam(@RequestParam("id") long id) {          return "Get a specific Bar with id=" + id;      }        我们可以通过RequestMapping定义参数列表        @RequestMapping(value = "/bars", params = "id")      @ResponseBody      public String getBarBySimplePathWithExplicitRequestParam(@RequestParam("id") long id) {          return "Get a specific Bar with id=" + id;      }        和        @RequestMapping(value = "/bars", params = { "id", "second" })      @ResponseBody      public 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 Cases    5.1 @RequestMapping多个路径映射到同一个controller的同一个方法        @RequestMapping(value = { "/advanced/bars", "/advanced/foos" })      @ResponseBody      public String getFoosOrBarsByPath() {          return "Advanced - Get some Foos or Bars";      }        下面这两个url会匹配到同一个方法        curl -i http://localhost:8080/springmvc/advanced/foos      curl -i http://localhost:8080/springmvc/advanced/bars        5.2@RequestMapping 多个http方法 映射到同一个controller的同一个方法        @RequestMapping(value = "/foos/multiple", method = { RequestMethod.PUT, RequestMethod.POST })      @ResponseBody      public String putAndPostFoos() {          return "Advanced - PUT and POST within single method";      }  下面这两个url都会匹配到上面这个方法        curl -i -X POST http://localhost:8080/springmvc/foos/multiple      curl -i -X PUT http://localhost:8080/springmvc/foos/multiple        5.3@RequestMapping 匹配所有方法        @RequestMapping(value = "*")      @ResponseBody      public String getFallback() {          return "Fallback for GET Requests";      }    匹配所有方法            @RequestMapping(value = "*", method = { RequestMethod.GET, RequestMethod.POST ... })      @ResponseBody      public String allFallback() {          return "Fallback for All Requests";      }        6.Spring Configuration    controller的annotation        @Controller      public class FooController { ... }        spring3.1        @Configuration      @EnableWebMvc      @ComponentScan({ "org.baeldung.spring.web.controller" })      public class MvcConfig {          //      }        可以从这里看到所有的示例https://github.com/eugenp/tutorials/tree/master/springmvc
本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/5332953.html,如需转载请自行联系原作者
你可能感兴趣的文章