一、JSONObject类详解:

JSONobject是FastJson提供的对象,在API中是用一个私有的常量map进行封装的,实际就是一个map,只不过 FastJson对其进行了封装,添加了很多方便快捷的属性方法。

添加相关依赖:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>

1、将Java对象转化成String:

2、将String类型转json对象,取JSON中KEY对应的VALUE:

3、将String对象转化为List类型:

public class JSONObjectDemo {

    public static void main(String[] args) {
//创建对象
List<JsonObjectVO> list = new ArrayList<>();
//对象1
JsonObjectVO vo1 = new JsonObjectVO();
vo1.setUuid(UUID.randomUUID().toString());
vo1.setName("1");
//对象2
JsonObjectVO vo2 = new JsonObjectVO();
vo2.setUuid(UUID.randomUUID().toString());
vo2.setName("2");
list.add(vo1);
list.add(vo2);
ResponseVO responseVO = ResponseVO.builder()
.uuid(UUID.randomUUID().toString())
.list(list)
.build();
/**
* 1、java对象转化成String
* toPrint:{"list":[{"name":"1","uuid":"b73bb9e8-f7a3-4dcf-8d8d-51313c7f5fd7"},{"name":"2","uuid":"ef109d35-cd07-45cd-9b45-791b205c878f"}],"uuid":"dbc3b9c6-2360-4b83-9d15-b88fe7980f27"}
* */
String str = JSONObject.toJSONString(responseVO);
/**
* 2、String类型转json对象,取JSON中的KEY
* toPrint:[{"name":"1","uuid":"b73bb9e8-f7a3-4dcf-8d8d-51313c7f5fd7"},{"name":"2","uuid":"ef109d35-cd07-45cd-9b45-791b205c878f"}]
* */
Object data = JSONObject.parseObject(str).get("list");
/**
* 3、将String对象转化为List类型
* toPrint:[JsonObjectVO(uuid=aebd390d-f543-4410-9c3a-98f2cb057757, name=1), JsonObjectVO(uuid=d170bb12-7570-47dd-8f2d-9ec2df5573c5, name=2)]
* */
List<JsonObjectVO> aList = JSONObject.parseArray(JSONObject.toJSONString(data),JsonObjectVO.class); System.out.println(str);
System.out.println(data);
System.out.println(aList);
}
}

二、RestTemplate详解:

RestTemplate是由Spring框架提供的一个可调用REST服务的类,它简化了与HTTP服务的通信方式,统一了RESTFUL的标准,封装了HTTP连接。相较于之前常用的HttpClient,RestTemplate是一种更为优雅的调用RESTFul服务的方式。

1、添加依赖:

<!--JSONObject插件-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>

2、声明RestTemplate配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; @Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
} }

3、自定义远程调用Client通用工具类(重):

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate; import java.util.HashSet;
import java.util.Map;
import java.util.Optional; @Slf4j
@Component
public class HttpClientUtil {
@Autowired
private RestTemplate restTemplate; /**
* @Param basisUrl:根地址(不带请求参数)
* @Param param:请求参数
* @Param method:请求方式(HttpMethod.GET、HttpMethod.POST......)
* @Param authToken:请求令牌
*/
public String getUrlResponse(String basisUrl, Map<Object, Object> param, HttpMethod method, String authToken) {
MultiValueMap heards = new LinkedMultiValueMap();
if (StringUtils.isNotBlank(authToken)) {
heards.add("Authorization", authToken);
}
//合成请求地址
String url = buildUrl(basisUrl, param);
log.info("请求地址为:" + url);
HttpEntity<Object> httpEntity = new HttpEntity<>(heards);
ResponseEntity<Object> response = restTemplate.exchange(url, method, httpEntity, Object.class, param);
String jsonString = JSONObject.toJSONString(response.getBody());
return jsonString;
} /**
* 拼接url地址:
* 例:http://127.0.0.1:xxx/xx/xxx?xx=xx&xx=xx
*/
private String buildUrl(String basisUrl, Map<Object, Object> param) {
StringBuilder params = new StringBuilder(basisUrl);
params.append("?");
Optional.ofNullable(param.entrySet()).orElse(new HashSet<>()).stream().forEach((Map.Entry entry) -> {
params.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
});
return params.toString().substring(0, params.toString().length() - 1);
}
}

三、远程调用的实现:

1、test-demo工程:

声明控制类:

@RestController
@RequestMapping("/v1")
public class DemoController {
@Autowired
private DemoService demoService; /**
* get方式
* 查询全量信息
*
* http://localhost:8081/v1/get-detail?pageNum=1&pageSize=8
* */
@GetMapping("/get-detail")
public Response<List<ResponseVO>> list1(
@RequestParam(value = "pageNum", required = false , defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", required = false , defaultValue = "8") Integer pageSize) {
return Response.success(demoService.selectDetail(pageNum , pageSize));
} /**
* post方式
* 查询全量信息
*
* http://localhost:8081/v1/post-detail
* */
@PostMapping("/post-detail")
public Response<List<ResponseVO>> list2() {
return Response.success(demoService.selectList());
}
}

2、client-demo工程:

(1)、获取test-demo工程接口返回:

@Component
@Slf4j
public class HttpClient {
@Autowired
private HttpClientUtil httpClientUtil; @Value("${url.v1.clent:http://localhost:8081/v1}")
private String url; public String getGetMethodURL() {
return url + "/get-detail";
} public String list() {
//获取根地址
String url = getGetMethodURL();
//放置请求参数
Map<Object, Object> param = new HashMap<>();
param.put("pageNum", 1);
param.put("pageSize", 100);
String jsonString = httpClientUtil.getUrlResponse(url, param, HttpMethod.GET, null);
Object data = JSONObject.parseObject(jsonString).get("entity");
if (ObjectUtils.isEmpty(data)) {
return "数据为空";
}
String dataList = JSONObject.toJSONString(data);
return dataList;
} }

(2)、业务类:

@Service
public class DemoServiceImpl implements DemoService {
@Autowired
private HttpClient httpClient; @Override
public String selectList() {
return httpClient.list();
}
}

搜索

复制

10、RestTemplate方式实现远程调用Client的更多相关文章

  1. spring boot / cloud (八) 使用RestTemplate来构建远程调用服务

    spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...

  2. RestTemplate + okhttp 实现远程调用

    1. 添加依赖 <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency ...

  3. Hessian怎样实现远程调用

    1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持. Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实 ...

  4. WebService与RMI(远程调用方式实现系统间通信)

    前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架 ...

  5. RestTemplate远程调用方法

    概述: spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值 ...

  6. dubbo支持的远程调用方式

    dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议) ...

  7. 【Jenkins】远程调用jenkins进行构建方式!

    前提:jenkins支持远程调用(具体设置自行百度)1.在我的个人中心--configure--API TOKEN--如果没有,则添加一个token,并生成,再复制并记录下来2.在你的job上面加上你 ...

  8. 架构师之路-在Dubbo中开发REST风格的远程调用

    架构师之路:从无到有搭建中小型互联网公司后台服务架构与运维架构 http://www.roncoo.com/course/view/ae1dbb70496349d3a8899b6c68f7d10b 概 ...

  9. 【Rest】在Dubbo中开发REST风格的远程调用(RESTful Remoting)

    目录 概述 REST的优点 应用场景 快速入门 标准Java REST API:JAX-RS简介 REST服务提供端详解 HTTP POST/GET的实现 Annotation放在接口类还是实现类 J ...

随机推荐

  1. 关于for循环当中发生强制类型转换的问题

    Map map1 = new HashMap(); Map map2 = new HashMap(); Map map3 = new HashMap(); List<Map> list = ...

  2. PhpStorm 2020.1.2破解 | JetBrains PhpStorm 2020.1.2破解版 附破解文件

    直接去官网下载 2020.1.2的版本,版本一定要对得上  是2020.1.2版本 下面是破解的jar,几兆而已 --------------------- 链接:https://pan.baidu. ...

  3. 基于数组或链表的学生信息管理系统(小学期C语言程序实训)

    1.基于数组的学生信息管理系统 实验内容: 编写并调试程序,实现学校各专业班级学生信息的管理.定义学生信息的结构体类型,包括:学号.姓名.专业.班级.3门成绩. 实验要求: (1) main函数:以菜 ...

  4. vue3+element-plus+登录逻辑token+环境搭建

    vue3+element-plus+登录逻辑token环境搭建 安装脚手架工具 1 npm i @vue/cli@4.5.13 -g 验证是否安装成功 1 vue -V # 输出 @vue/cli 4 ...

  5. easyclick 学习

    什么是EC EasyClick 写自动化脚本,使用的编辑器 Idea 运行模式有两种:无障碍模式.代理模式 注释 三种类型: 1./** 对程序作介绍,解释说明用 / 2./* 多行注释 第二行 / ...

  6. LoadRunner11使用代理录制脚本

    一.背景 电脑安装了LoadRunner11,在进行脚本录制时发现录制的脚本为空,即录制时事件为0,也没有自动调出对应的浏览器:如下图: 问了度娘,发现LR11要成功录制脚本,对各浏览器的版本有要求! ...

  7. 网页嵌入zabbix页面(不同域名)

    先来结论: 方案一:绕过身份验证:https://www.cnblogs.com/JaSonS-toy/p/4939805.html(我不是这样实现,可以自行尝试) 方案二: 1.保证请求的ip与请求 ...

  8. .NET深入了解哈希表和Dictionary

    引子 问题:给定一串数字{1,2,5,7,15,24,33,52},如何在时间复杂度为O(1)下,对数据进行CURD? 数组:我创建一个Length为53的数组,将元素插入相同下标处,是不是就可以实现 ...

  9. 使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个后台管理应用

    使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个管理应用的记录 使用vite 创建项目 我创建的node 版本是 v16.17.1 使用N ...

  10. laravel框架 url地址传参

    //前端页面 <a title="编辑" onclick="xadmin.open('编辑','{{url("admin/Manager/edit&quo ...