一、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. HTML5中新增实用的标签

    1:progress  进度条 <h3>progress</h3> <progress value="75" max="100"& ...

  2. 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...

  3. Java 8 Time API

    Java 8 系列文章 持续更新中 日期时间API 也是Java 8重要的更新之一,Java从一开始就缺少一致的日期和时间方法,Java 8 Date Time API是Java核心API的一个非常好 ...

  4. SpringCloud怎么迈向云原生?

    很多公司由于历史原因,都会有自研的RPC框架. 尤其是在2015-2017期间,Spring Cloud刚刚面世,Dubbo停止维护多年,很多公司在设计自己的RPC框架时,都会基于Spring Clo ...

  5. day05-JavaScript02

    JavaScript02 8.JavaScript函数 JavaScript函数介绍 函数是由事件驱动的,或者当它被调用时,执行的可重复使用的代码 例子 <!DOCTYPE html> & ...

  6. Vue报错:component has been registered but not used

    原因: ​​eslint​​代码检查到你注册了组件但没有使用,然后就报错了.比如代码: 比如​​Vue​​​中注册了​​File​​组件,而实际上却没有使用到(直接取消注册为好): ... impor ...

  7. letcode-学习-数组去重

    数组去重 问题描述: 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度.元素的 相对顺序 应该保持 一致 . 由于在某些语言中不 ...

  8. 用Nodejs 实现一个简单的 Redis客户端

    目录 0. 写在前面 1. 背景映入 2. 数据库选择 3. Nodejs TCP连接 3. 代码编写 4. 实验 5. wireshark 抓包分析 6. 杂与代码 0. 写在前面 大家如果有去看过 ...

  9. AK/SK加密认证

    AK/SK认证的实现 AK/SK概述 1.什么是AKSK ak/sk是一种身份认证方式,常用于系统间接口调用时的身份验证,其中ak为Access Key ID,sk为Secret Access Key ...

  10. 【项目】AtCoder for Chinese

    前排提示:Github 内容搭配梯子食用效果更佳( 项目地址 网页 插件安装 Join us or Give us a star ! 注:因内容迁移,下列链接暂时失效(用空再搬一遍)qwq Trans ...