一、本地环境
-
操作系统:Mac OS X 10.13.2
-
编辑器:IntelliJ IDEA 2017
-
JDK版本:jdk 1.8
-
Maven版本:apache-maven-3.5.0
-
SpringBoot版本:SpringBoot 2.0
二、构建工程(用的是gif动图,网速差的可能加载比较慢)
三、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.lonelycountry</groupId>
<artifactId>springboot_01_restful_web_service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot_01_restful_web_service</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- web相关开发类 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok工具类 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
复制代码
特殊说明:
lombok
是个注解增强类,在pojo
类中使用lombok
注解可以减少编写set/get/constructor
方法,一个注解搞定,具体可以查看lombok文档。如果需要使用这个类库,需要安装相关编辑器的插件。
四、相关代码
1、结构
2、代码
Application层
package com.lonelycountry;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class Springboot01RestfulWebServiceApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot01RestfulWebServiceApplication.class, args);
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
复制代码
解读:
main
方法是用来启动SpringBoot
自带的tomcat
容器,restTemplate
方法是把RestTemplate
注册到bean
中。
Vo层
package com.lonelycountry.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author YeFan
* 2018/4/2.
*/
@Data
@AllArgsConstructor
public class GreetingVo {
private Long id;
private String name;
}
复制代码
package com.lonelycountry.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* @author YeFan
* 2018/4/2.
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Quote {
private String type;
private Value value;
}
复制代码
package com.lonelycountry.vo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
/**
* @author YeFan
* 2018/4/2.
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Value {
private Long id;
private String quote;
}
复制代码
说明:
@Data
注解是为类中的成员变量自动生成get/set
方法,@AllArgsConstructor
注解是为类提供全部成员变量的构造方法。
Controller层
package com.lonelycountry.controller;
import com.lonelycountry.vo.GreetingVo;
import com.lonelycountry.vo.Quote;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.atomic.AtomicLong;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
/**
* @author YeFan
* 2018/4/2.
*/
@RestController
@RequestMapping(value = "/api")
public class GreetingController {
private static final String TEMPLATE = "hello,%s!";
private final AtomicLong counter = new AtomicLong();
private final RestTemplate restTemplate;
@Autowired
public GreetingController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@RequestMapping(value = "/greeting", method = GET)
public GreetingVo greeting(@RequestParam(value = "name", defaultValue = "world") String name) {
return new GreetingVo(counter.incrementAndGet(), String.format(TEMPLATE, name));
}
@RequestMapping(value = "/greeting2/{name}", method = GET)
public GreetingVo greeting2(@PathVariable(value = "name") String name) {
return new GreetingVo(counter.incrementAndGet(), String.format(TEMPLATE, name));
}
@RequestMapping(value = "/client", method = GET)
public Quote client() {
RestTemplate restTemplate2 = new RestTemplate();
return restTemplate2.getForObject("http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
}
@RequestMapping(value = "/client2", method = GET)
public Quote client2() {
return restTemplate.getForObject("http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
}
}
复制代码
说明:
@RequestMapping(value = "/client2")
注解用来标注类路径或者方法,增加method
属性可以告诉以什么方式处理请求,如果不写会默认使用get/post
方式进行解析(具体使用哪种会根据前端的请求方式进行自动选择)。
在类上使用注解@RestController
或者在方法上使用注解@ResponseBody
会告诉方法要返回的不是一个view
而是json
,Spring
会使用jackson
工具类进行自动解析转换,无须自己转换。
解读:
程序中提供了两种restful
服务器端代码以及两种restful
客户端代码。如果你有的方法要返回视图的话,可以在类上使用@Controller
注解,然后在需要返回json
的方法上单独加@ResponseBody
注解restful
服务器端:
1、方法greeting()
对应的是/api/greeting?name=xxx
格式,通过@RequestParam(value = "name", defaultValue = "world")
注解进行获取url
中带的参数,其中value
的值是参数的名字,defaultValue
代表默认值,可以不写。
2、方法greeting2()
对应的是/api/greeting/name
格式,通过@PathVariable(value = "name")
注解进行获取url
中带的参数,其中value
的值是参数的名字。restful
客户端:
1、方法client()
使用new
一个RestTemplate
对象,把对应的rest
地址以及想转成的类类型传入,进行转换。
2、方法client2()
使用成员变量restTemplate
进行操作1
中的步骤,想使用这个方法需要在Springboot01RestfulWebServiceApplication
类(启动类)中进行注册bean
,然后在变量上面或者带该参数的构造方法上面使用@Autowired
进行匹配(官方建议在构造方法中进行注册,这样的Controller
更加的安全)。
五、测试
测试使用IntelliJ IDEA自带的rest服务测试进行测试。
1、greeting()方法
2、greeting2()方法
3、client()方法
4、client2()方法
六、代码地址及参考文档
源代码
Spring-Building a RESTful Web Service
Spring-Consuming a RESTful Web Service
七、说明
本文为原创,转载请注明原处。