如何使用REST请求风格
REST:即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。
它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用。
HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:
- GET 用来获取资源
- POST 用来新建资源
- PUT 用来更新资源
- DELETE 用来删除资源
示例:
- /order/1 HTTP GET :得到 id = 1 的 order
- /order/1 HTTP DELETE:删除 id = 1的 order
- /order/1 HTTP PUT:更新id = 1的 order
- /order HTTP POST:新增 order
浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器HiddenHttpMethodFilter,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。
POST请求如何转化为put请求和delele请求?
1、在web.xml文件中配置:
1 <!-- 配置springMVC --> 2 <servlet> 3 <servlet-name>SpringMVC</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <!-- contextConfigLocation配置SpringMVC加载的配置文件(配置处理器映射器、适配器等等)--> 6 <init-param> 7 <param-name>contextConfigLocation</param-name> 8 <param-value>classpath:springmvc.xml</param-value> 9 </init-param> 10 <load-on-startup>1</load-on-startup> 11 </servlet> 12 <servlet-mapping> 13 <servlet-name>SpringMVC</servlet-name> 14 <!-- 第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析 15 第二种:/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析 16 使用此种方式可以实现 RESTful风格的URL 17 第三种:/*,这样配置不对,使用这种配置,最终要转发到一个JSP页面时, 仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。 --> 18 <url-pattern>/</url-pattern> 19 </servlet-mapping> 20 <!-- HiddenHttpMethodFilter过滤器可以将POST请求转化为put请求和delete请求! --> 21 <filter> 22 <filter-name>hiddenHttpMethodFilter</filter-name> 23 <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 24 </filter> 25 <filter-mapping> 26 <filter-name>hiddenHttpMethodFilter</filter-name> 27 <url-pattern>/*</url-pattern> 28 </filter-mapping>
2、在表单域中需要携带一个name值为_method,value值为put或者delete的参数,get和post方法正常使用,如下所示:
1 <!-- REST-----GET --> 2 <a href="${pageContext.request.contextPath }/order/1">提交get请求</a> 3 <!-- REST-----POST --> 4 <form action="${pageContext.request.contextPath }/order/1" method="post"> 5 <input type="submit" value="提交POST请求"> 6 </form> 7 <!-- REST-----PUT --> 8 <form action="${pageContext.request.contextPath }/order/1" method="post"> 9 <input type="hidden" name="_method" value="put"> 10 <input type="submit" value="提交put请求"> 11 </form> 12 <!-- REST-----DELETE --> 13 <form action="${pageContext.request.contextPath }/order/1" method="post"> 14 <input type="hidden" name="_method" value="delete"> 15 <input type="submit" value="提交delete请求"> 16 </form>
3、在后台接收参数并作处理,
@RequestMapping中的参数名称必须和@PathVariable中value的值相同。
1 public static String SUCCESS="success";//WEB-INF下的success.jsp 2 //REST请求方式-----GET获取 3 @RequestMapping(value="/order/{id}",method=RequestMethod.GET) 4 public String helloGet(@PathVariable(value="id") Integer id){ 5 System.out.println("GET-------"+id); 6 return SUCCESS; 7 } 8 //REST请求方式-----POST添加 9 @RequestMapping(value="/order/{id}",method=RequestMethod.POST) 10 public String helloPost(@PathVariable(value="id") Integer id){ 11 System.out.println("POST-------"+id); 12 return SUCCESS; 13 } 14 //REST请求方式-----PUT修改 15 @RequestMapping(value="/order/{id}",method=RequestMethod.PUT) 16 public String helloPut(@PathVariable(value="id") Integer id){ 17 System.out.println("PUT-------"+id); 18 return SUCCESS; 19 } 20 //REST请求方式-----DELETE删除 21 @RequestMapping(value="/order/{id}",method=RequestMethod.DELETE) 22 public String helloDelete(@PathVariable(value="id") Integer id){ 23 System.out.println("DELETE-------"+id); 24 return SUCCESS; 25 }
不想学好基础的程序员不是好的程序员。