1.什么是REST?
表述性状态转移,是web服务器的一种架构风格,就是一种架构。
它是轻量级、跨平台、跨语言的一个架构。它是一种设计风格但不是标准。
表述性:就是通过各种各样的格式来描述你的资源
状态:REST只关心资源的状态,并不关心它的行为,比如:关心
资源在不在、有没有修改.
转移:比如将html文件转译为JSON
——实现前后端分离(设计一套API提供给各个产品实现)
2.什么是RESTful
一个架构符合REST原则,我们成为RESTful架构。
3.Spring如何支持REST
(1)支持的方式
*控制器可以处理所有的HTTP方法。包括四个主要的REST方法:GET,PUT,DELETE,POST。
*通过@PathVariable注解,控制器能够处理参数化URL。
*借助Spring的视图和视图解析器,资源能够以多种方式进行表达。
*借助 RestTemplate 类Spring应用能方便的使用REST资源 。
(2)资源转换
Spring提供了两种方法将资源的java表述形式转化为客户端的表达式:
*内容协商:选择一个视图,它能够将模型渲染为呈现给客户端的表达式。
*消息转换器:通过一个消息转化器将控制器所返回的对象转换为呈现给客户端的表属形式。
下面我们来看看消息转换器具体的实现方式:
我们常用的消息转换器有:
GsonHttpMessageConverter
StringHttpMessageConverter
(1)创建项目
(2)pom文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wschase</groupId>
<artifactId>springmvc-case-rest</artifactId>
<version>1.0.0</version>
<!--打包类型-->
<packaging>war</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--上传文件-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!--JSON处理库-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
<!--日志依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>
</project>
(3)web.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Welcome to Spring MVC</display-name>
<description>
Welcome to Spring MVC REST
</description>
<!--1.上下文,与Spring Core容器相关-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--2.前端控制器,导演-->
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--3.欢迎页面-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
(4)具体实现
package com.wschase.rest.control;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Author:WSChase
* Created:2019/5/4
*/
@RestController
//在这个RestController里面加了@ResponseBody,这样的话就意味着我们在RestController里面写的都将作为响应内容进行处理
//而不会作为视图。
//1.返回一个文本
@RequestMapping(value = "/system")
public class SystemInfoController {
@RequestMapping(value = "/index",method = {RequestMethod.GET})
public String index(){
return "hello";//作为一个文本信息返回给我们的用户
}
//2.返回一个JSON
@RequestMapping(value = "/info",method = {RequestMethod.GET})
public Map<String,String> info(){
Map<String, String> data = new HashMap<>();
data.put("date_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
Runtime runtime = Runtime.getRuntime();
data.put("server_processor", String.valueOf(runtime.availableProcessors()));
data.put("server_total_memory", runtime.totalMemory() / 1024 / 1024 + " MB");
data.put("server_max_memory", runtime.maxMemory() / 1024 / 1024 + " MB");
data.put("server_free_memory", runtime.freeMemory() / 1024 / 1024 + " MB");
return data;
}
/**
* 3.将我的请求数据转化成一个Java对象
* 这个过程体现了RESTful的整个流程:
* 将请求数据(需要是JSON格式的)转化为java对象,再将java对象转化为响应数据
* 注意:你返回的类型要么是你自定义的java类型、要么是HashMap或者ArrayList,不要返回JSON对象
* 它会自动将你的返回类型转化为JSON类型
* @param user
* @return
*/
@RequestMapping(value = "/user",method = {RequestMethod.POST})
public User query(@RequestBody User user){
return user;
}
public static class User{
private String name;
private Integer age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
}
(5)运行结果