开发环境:IntelliJ IDEA 2019.2.2
Spring Boot版本:2.1.8

一、发布REST服务

1、IDEA新建一个名称为rest-server的Spring Boot项目

2、新建一个实体类User.java

package com.example.restserver.domain;

public class User {
String name;
Integer age; 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;
}
}

3、新建一个控制器类 UserController.java

package com.example.restserver.web;

import com.example.restserver.domain.User;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class UserController { @RequestMapping(value="/user/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
public User user(@PathVariable String name) {
User u = new User();
u.setName(name);
u.setAge(30);
return u;
}
}

项目结构如下:

访问 http://localhost:8080/user/lc,页面显示:

{"name":"lc","age":30}

二、使用RestTemplae调用服务

1、IDEA新建一个名称为rest-client的Spring Boot项目

2、新建一个含有main方法的普通类 RestTemplateMain.java,调用服务

package com.example.restclient;

import com.example.restclient.domain.User;
import org.springframework.web.client.RestTemplate; public class RestTemplateMain {
public static void main(String[] args){
RestTemplate tpl = new RestTemplate();
User u = tpl.getForObject("http://localhost:8080/user/lc", User.class);
System.out.println(u.getName() + "," + u.getAge());
}
}

右键Run 'RestTemplateMain.main()',控制台输出:lc,30

3、在bean里面使用RestTemplate,可使用RestTemplateBuilder,新建类 UserService.java

package com.example.restclient.service;

import com.example.restclient.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; @Service
public class UserService {
@Autowired
private RestTemplateBuilder builder; @Bean
public RestTemplate restTemplate(){
return builder.rootUri("http://localhost:8080").build();
} public User userBuilder(String name){
User u = restTemplate().getForObject("/user/" + name, User.class);
return u;
} }

4、编写一个单元测试类,来测试上面的UserService的bean。

package com.example.restclient.service;

import com.example.restclient.domain.User;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserServiceTest {
@Autowired
private UserService userService; @Test
public void testUser(){
User u = userService.userBuilder("lc");
Assert.assertEquals("lc", u.getName());
}
}

5、控制器类UserController.cs 中调用

配置在application.properties 配置端口和8080不一样,如 server.port = 9001

    @Autowired
private UserService userService; @RequestMapping(value="/user/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
public User user(@PathVariable String name) {
User u = userService.userBuilder(name);
return u;
}

三、使用Feign调用服务

继续在rest-client项目基础上修改代码。

1、pom.xml添加依赖

        <dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>9.5.0</version>
</dependency> <dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>9.5.0</version>
</dependency>

2、新建接口 UserClient.java

package com.example.restclient.service;

import com.example.restclient.domain.User;
import feign.Param;
import feign.RequestLine; public interface UserClient { @RequestLine("GET /user/{name}")
User getUser(@Param("name")String name); }

3、在控制器类 UserController.java 中调用

decoder(new GsonDecoder()) 表示添加了解码器的配置,GsonDecoder会将返回的JSON字符串转换为接口方法返回的对象。
相反的,encoder(new GsonEncoder())则是编码器,将对象转换为JSON字符串。

    @RequestMapping(value="/user2/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
public User user2(@PathVariable String name) {
UserClient service = Feign.builder().decoder(new GsonDecoder())
.target(UserClient.class, "http://localhost:8080/");
User u = service.getUser(name);
return u;
}

4、优化第3步代码,并把请求地址放到配置文件中。

(1)application.properties 添加配置

application.client.url = http://localhost:8080

(2)新建配置类ClientConfig.java

package com.example.restclient.config;

import com.example.restclient.service.UserClient;
import feign.Feign;
import feign.gson.GsonDecoder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class ClientConfig {
@Value("${application.client.url}")
private String clientUrl; @Bean
UserClient userClient(){
UserClient client = Feign.builder()
.decoder(new GsonDecoder())
.target(UserClient.class, clientUrl);
return client;
}
}

(3)控制器 UserController.java  中调用

    @Autowired
private UserClient userClient; @RequestMapping(value="/user3/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
public User user3(@PathVariable String name) {
User u = userClient.getUser(name);
return u;
}

UserController.java最终内容:

package com.example.restclient.web;

import com.example.restclient.domain.User;
import com.example.restclient.service.UserClient;
import com.example.restclient.service.UserService;
import feign.Feign;
import feign.gson.GsonDecoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class UserController {
@Autowired
private UserService userService;
@Autowired
private UserClient userClient; @RequestMapping(value="/user/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
public User user(@PathVariable String name) {
User u = userService.userBuilder(name);
return u;
} @RequestMapping(value="/user2/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
public User user2(@PathVariable String name) {
UserClient service = Feign.builder().decoder(new GsonDecoder())
.target(UserClient.class, "http://localhost:8080/");
User u = service.getUser(name);
return u;
} @RequestMapping(value="/user3/{name}", produces = MediaType.APPLICATION_JSON_VALUE)
public User user3(@PathVariable String name) {
User u = userClient.getUser(name);
return u;
}
}

项目结构

先后访问下面地址,可见到输出正常结果

http://localhost:9001/user/lc
http://localhost:9001/user2/lc2
http://localhost:9001/user3/lc3

Spring Boot 2 发布与调用REST服务的更多相关文章

  1. spring boot 集成 Apache CXF 调用 .NET 服务端 WebService

    1. pom.xml加入 cxf 的依赖 <dependency> <groupId>org.apache.cxf</groupId> <artifactId ...

  2. Spring Boot工程发布到Docker

    先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布 ...

  3. 使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices wit ...

  4. spring boot项目发布tomcat容器(包含发布到tomcat6的方法)

    spring boot因为内嵌tomcat容器,所以可以通过打包为jar包的方法将项目发布,但是如何将spring boot项目打包成可发布到tomcat中的war包项目呢? 1. 既然需要打包成wa ...

  5. Spring Boot同时开启HTTP和HTTPS服务

    由于Spring Boot中通过编码开启HTTPS服务比较复杂,所以官方推荐通过编码开启HTTP服务,而通过配置开启HTTPS服务. Spring Boot的application.yml中添加如下配 ...

  6. Spring Boot 2.X(十三):邮件服务

    前言 邮件服务在开发中非常常见,比如用邮件注册账号.邮件作为找回密码的途径.用于订阅内容定期邮件推送等等,下面就简单的介绍下邮件实现方式. 准备 一个用于发送的邮箱,本文是用腾讯的域名邮箱,可以自己搞 ...

  7. 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...

  8. spring boot(二十)使用spring-boot-admin对服务进行监控

    上一篇文章<springboot(十九):使用Spring Boot Actuator监控应用>介绍了Spring Boot Actuator的使用,Spring Boot Actuato ...

  9. WebService—CXF整合Spring实现接口发布和调用过程

    一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId> ...

随机推荐

  1. 域控权限提升PTH攻击

    0x01 漏洞利用条件 1.被pth攻击的计算机未打补丁(KB2871997)2.拿到一台域成员主机并且拿到管理员组的域用户的NTML 3.对方主机存在相同账号并且是管理员组成员 0x02 本地用户N ...

  2. java月考题JSD1908第二次月考(含答案和解析)

    考试 .container { clear: both; margin: 0 auto; text-align: left; /*width: 1200px;*/ } .container:after ...

  3. SpringMVC的自动配置解析

    https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features-developin ...

  4. ReactNative: 使用AsyncStorage异步存储类

    一.简介 AsyncStorage是一个简单的具有异步特性可持久化的键值对key-value的存储系统.它对整个APP而言,是一个全局的存储空间,可以用来替代H5中提供的window属性LocalSt ...

  5. IT兄弟连 HTML5教程 响应式布局实例

    在学习Media Queries模块前,先通过一个响应式布局实例来了解一下响应式布局和Media Queries模块的简单应用.在本例中,使用HTML5的结构元素定义了5个盒子.当浏览器窗口尺寸不同时 ...

  6. DataGridView使用BindingNavigator实现简单分页功能

    接上一篇<DataGridView使用自定义控件实现简单分页功能>,本篇使用BindingNavigator来实现简单分页功能.其实也只是借用了一个BindingNavigator空壳, ...

  7. Python小技巧:打印出来的文本文档中间有空格

    问题描述: 在file.txt中存了内容如下 AAAAAA BBBBBB CCCCCC 然后采用python显示,发现显示出来的是这样的 A A A A A A B B B B B B C C C C ...

  8. Kotlin exception

    cannot generate view binders java.lang.StackOverflowError 最近写kotlin项目,使用databinding,在适配器中定义了事件接口,在适配 ...

  9. Windows添加自定义开机用户登录启动程序

    默认的启动程序 Ctrl+shift -> Esc调用任务管理器-->启动项选项即可完成计算机开机自启动选项,不过这里只有系统默认添加的. 添加自定义开机启动程序 Windows+R调用运 ...

  10. Python3操作MySQL基于PyMySQL封装的类

    Python3操作MySQL基于PyMySQL封装的类   在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...