Spring Boot2發(fā)布調(diào)用REST服務(wù)實(shí)現(xiàn)方法
開(kāi)發(fā)環(huán)境:IntelliJ IDEA 2019.2.2
Spring Boot版本:2.1.8
一、發(fā)布REST服務(wù)
1、IDEA新建一個(gè)名稱為rest-server的Spring Boot項(xiàng)目
2、新建一個(gè)實(shí)體類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、新建一個(gè)控制器類 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;
}
}
項(xiàng)目結(jié)構(gòu)如下:

訪問(wèn)http://localhost:8080/user/lc,頁(yè)面顯示:
{"name":"lc","age":30}
二、使用RestTemplae調(diào)用服務(wù)
1、IDEA新建一個(gè)名稱為rest-client的Spring Boot項(xiàng)目
2、新建一個(gè)含有main方法的普通類RestTemplateMain.java,調(diào)用服務(wù)
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()',控制臺(tái)輸出: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、編寫一個(gè)單元測(cè)試類,來(lái)測(cè)試上面的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 中調(diào)用
配置在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調(diào)用服務(wù)
繼續(xù)在rest-client項(xiàng)目基礎(chǔ)上修改代碼。
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 中調(diào)用
decoder(new GsonDecoder()) 表示添加了解碼器的配置,GsonDecoder會(huì)將返回的JSON字符串轉(zhuǎn)換為接口方法返回的對(duì)象。
相反的,encoder(new GsonEncoder())則是編碼器,將對(duì)象轉(zhuǎn)換為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、優(yōu)化第3步代碼,并把請(qǐng)求地址放到配置文件中。
(1)application.properties 添加配置
(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 中調(diào)用
@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最終內(nèi)容:
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;
}
}
項(xiàng)目結(jié)構(gòu)

先后訪問(wèn)下面地址,可見(jiàn)到輸出正常結(jié)果
http://localhost:9001/user/lc
http://localhost:9001/user2/lc2
http://localhost:9001/user3/lc3
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot http請(qǐng)求注解@RestController原理解析
- Spring boot2X Consul如何通過(guò)RestTemplate實(shí)現(xiàn)服務(wù)調(diào)用
- SpringBoot Security整合JWT授權(quán)RestAPI的實(shí)現(xiàn)
- 詳解SpringBoot中RestTemplate的幾種實(shí)現(xiàn)
- SpringBoot框架RESTful接口設(shè)置跨域允許
- Springboot RestTemplate 簡(jiǎn)單使用解析
- SpringBoot+Spring Security+JWT實(shí)現(xiàn)RESTful Api權(quán)限控制的方法
- Spring Boot RestTemplate提交表單數(shù)據(jù)的三種方法
相關(guān)文章
Java與SpringBoot對(duì)redis的使用方式
這篇文章主要介紹了Java與SpringBoot對(duì)redis的使用方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08
package打包一個(gè)springcloud項(xiàng)目的某個(gè)微服務(wù)報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了package打包一個(gè)springcloud項(xiàng)目的某個(gè)微服務(wù)報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置指南
這篇文章主要給大家介紹了關(guān)于SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置的相關(guān)資料,在Java SpringBoot項(xiàng)目中如果使用了Mybatis框架,默認(rèn)情況下執(zhí)行的所有SQL操作都不會(huì)打印日志,需要的朋友可以參考下2023-10-10
mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在
這篇文章主要介紹了mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在,具有很好的參考價(jià)值,希望對(duì)的有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
mybatis如何設(shè)置useGeneratedKeys=true
這篇文章主要介紹了mybatis如何設(shè)置useGeneratedKeys=true,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-01-01
SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效問(wèn)題解決
這篇文章主要介紹了SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01
Java開(kāi)發(fā)框架spring實(shí)現(xiàn)自定義緩存標(biāo)簽
這篇文章主要介紹了Java開(kāi)發(fā)框架spring實(shí)現(xiàn)自定義緩存標(biāo)簽的詳細(xì)代碼,感興趣的小伙伴們可以參考一下2015-12-12

