使用restTemplate远程调用controller路径取数据

时间:2021-08-11 15:14:27

 

restTemplate远程调controller路径取数据

Spring的RestTemplate提供了很多对HTTP method的支持,这里主要说常用的get和post。

使用环境为springboot

 

首先要写相关配置类,举例:

@Configuration
public class Config {
  @Autowired
  RestTemplateBuilder builder;
  @Bean
  public RestTemplate restTemplate() {
    return builder.build();
  }
}

 

然后调目标cotroller层,比如目标cotroller层为

@RestController
@RequestMapping("/aaa")
public class TemplateController {
  @PostMapping(value = "/ppp")
  public List<Students> getInfo(@RequestBody String sid) {
    ...
    return stuService.getId(areaId);
  }
}

 

需要用post的方法去调

  @Autowired
  private RestTemplate restTemplate;
  public List<Student> getMsg() {
    String id = "111";
    HttpEntity<String> entity = buildEntity(id);
    String url = "http://ip:port/aaa/ppp";
    return restTemplate.postForObject(url, entity, List.class);
  }
  private HttpEntity<String> buildEntity(String id) {
    JSONObject jo = new JSONObject();
    jo.put("sid", id);
    String requestJson = jo.toJSONString();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    return new HttpEntity<String>(requestJson, headers);
  }

 

再比如目标controller层为

@RestController
@RequestMapping(value = "/aaa")
public class StudentController {
    @GetMapping(value = "/ggg")
  public Set<Students> queryStudent(@RequestParam(value = "code") String code,
      @RequestParam(value = "objectKey") String objectKey,
      @RequestParam(value = "studentId") Integer studentId) {
    return sService.get(code, objectKey, kindId);
  }
}

 

需要用get的方法去调

 @Autowired
  private RestTemplate restTemplate;
  public Set queryStudent(String ip, int port,EventRelationTask eventRelationTask) {
    Integer studentId = eventRelationTask.getStudentId();
    String code = eventRelationTask.getCode();
    String objectKey = eventRelationTask.getObjectKey();
    String url =
        "http://" + ip + ":" + port + Student.PROJECTNAME + "event/queryparentnode?code=" + code + "&objectKey=" + objectKey + "&studentId=" + studentId;
    Set<Student> students = new HashSet<>();
    students = restTemplate.getForObject(url, Set.class);   //主要这个方法
    if (students != null) {
      return students;
    }
    return new HashSet();
  }

 

通过Spring的RestTemplate进行跨模块调用

Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现对象与json的序列化和反序列化。首先在项目中新建controller方法

 

相关代码如图下所示:

使用restTemplate远程调用controller路径取数据

接着我们在另外一个项目中的启动类的位置注册一个RestTemplate实例

 

相关代码可参考图下所示:

使用restTemplate远程调用controller路径取数据

然后创建HttpTestController使用RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用前一个项目中服务端的数据并返回结果。

使用restTemplate远程调用controller路径取数据

最后访问http://localhost:8080/httpTestController/queryByname?name=张三就能看到list打印传递的值。需要注意的是图1是第一个项目请求的,图2是第二个项目通过跨服务跨项目请求得来的,它们两者的端口号是不一样的

 

运行结果如下所示:

使用restTemplate远程调用controller路径取数据

(图1)

使用restTemplate远程调用controller路径取数据

(图2)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/renhuan28/article/details/80512851