zoukankan      html  css  js  c++  java
  • spring3 的restful API RequestMapping介绍

    原文链接:http://www.javaarch.net/jiagoushi/694.htm

    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  
  • 相关阅读:
    OSPF的简易模拟配置第二篇
    OSPF的简易模拟配置第一篇
    RIP简易配置第二篇
    linux常用命令集(压缩和归档操作-共16个)
    简易路由重分布配置
    linux常用命令集(磁盘和文件系统操作-共15个)
    简易的浮动静态路由配置
    神州数码DHCP及DHCP中继配置
    神州数码HSRP(热备份路由协议)配置
    神州数码策略路由(PBR)配置
  • 原文地址:https://www.cnblogs.com/rwxwsblog/p/5332953.html
Copyright © 2011-2022 走看看