spring构建一个 RESTful Web Service
1.简介
RESTful(Representational state transfer))简化了 web service 的设计,它不再需要 wsdl ,也不再需要 soap 协议,而是通过最简单的 http 协议传输数据 ( 包括 xml 或 json) 。既简化了设计,也减少了网络传输量(因为只传输代表数据的 xml 或 json ,没有额外的 xml 包装),是一种接口规范。
2.如何构建
要求:建立一个接受HTTP GET请求的服务。
请求:http://localhost:8080/greeting
响应:{“id”:1,“content”:“Hello, World!”}
1.1 使用spring Initialize开始构建
使用Maven,参照Spring Initializr生成具有所需依赖项的新项目(Spring Web)。
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>rest-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rest-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 自己定制构建
参考: https://start.spring.io/.
增加需要的依赖,然后点击下方的生成即可得到一个自定义的项目。
1.3 使用idea 构建该项目
本文使用的是社区版idea,因此使用maven构建该项目,然后导入刚刚生成的pom文件,覆盖原有的pom文件,然后点击刷新导入依赖文件。如下:
1.4 创建相应的bean和controller
1.创建bean类
POJO(plain old java object)。感觉和javaBean差不多。
package com.example.restservice;
public class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
2.创建controller
controller类负责处理客户端的请求
package com.example.restservice;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}
其中 @GetMapping("/greeting") 这个注解可以使得前端请求的http get请求 映射到该方法(greeting)上;
@RequestParam 这个注解将查询字符串参数的值绑定到方法的参数中,即name上,请求中不存在该参数就设置word为默认值;
注意点:@Controller,@RestController注解的不同,该注解将类标记为控制器,其中,@RestController每个方法均返回域对象而不是视图。 这是同时包含@Controller和@ResponseBody的简写。
为了使得Greeting返回的对象是json,所以必须进行转换,但是spring的http提供的这种转换(MappingJackson2HttpMessageConverter会自动的去转换返回的对象 )。
@SpringBootApplication 是Sprnig Boot项目的核心注解,目的是开启自动配置
注解 | 含义 |
---|---|
@Configuration | @Configuration标注在类上,相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文) |
@EnableAutoConfiguration | 借助@Import的支持,收集和注册特定场景相关的bean定义。将所有符合自动配置条件的bean定义加载到IoC容器 |
@ComponentScan | 自动扫描并加载符合条件的组件,(Configuration,Component,Service)我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描 |
3.创建 Application
package com.example.restservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
运行 Application类。然后分别访问http://127.0.0.1:8080/greeting;http://localhost:8080/greeting?name=User