Spring Boot2发布调用REST服务实现方法

网友投稿 241 2022-12-08


Spring Boot2发布调用REST服务实现方法

开发环境: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 clashttp://s 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 IZYVXmscom.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添加依赖

io.github.openfeign

feign-core

9.5.0

io.github.openfeign

feign-gson

9.5.0

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}", prohttp://duces = 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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringMVC后端返回数据到前端代码示例
下一篇:IDEA 必要配置设置方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~