淘先锋技术网

首页 1 2 3 4 5 6 7

一、本地环境

  • 操作系统: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而是jsonSpring会使用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

七、说明

本文为原创,转载请注明原处。