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

  • 相关阅读:
    Python之路Day11
    Python之路Day10
    Python中需要注意的一些小坑
    Python之路Day09
    Python之路Day08
    关于谷歌浏览器安装非官方商城插件
    Python之路Day07
    Python之路Day06
    Python之路Day05
    Python 之路Day04
  • 原文地址:https://www.cnblogs.com/AloneSword/p/4099142.html
Copyright © 2011-2022 走看看