SpringBoot Http远程调用的方法
作者:ItDylan 发布时间:2022-07-22 04:08:33
本文实例为大家分享了SpringBoot Http远程调用的具体代码,供大家参考,具体内容如下
一、在实现远程调用时可以使用feign与http远程调用,两者的关系有一下几点:
feign、http,有时候在调用第三方api的时候、使用httpclient,别人的接口不可能提供它的配置,自己项目框架是spring的,使用feign相互配置,都是okhttpclient的方式。Feign是一个接口声明式调用框架,实现了一个抽象层的逻辑,没有真正实现底层http请求,提供了一个client接口用于实现底层http操作,默认提供的实现是基于httpurlconnection,也有基于apachehttpclient的实现,且feign具有分布式负载均衡功能。
二、使用案例
需求是在本服务中调用另外一个服务中的设备上线的功能,有feign、http等可以选择,这里选择的是http调用。
/**
* 超级管理员授权
* @param userName
* @param clientid
* @return
*/
@PostMapping("/mqtt/superuser")
@Transactional
public Integer loginCheck2(@RequestParam("username") String userName,
@RequestParam("clientid") String clientid){
System.out.println(userName);
System.out.println("超级管理员");
userName = "6217XXXXXXXXXXXd85/3XXXX3";
//拼接实体类跳转ibms-iot平台,上线
publishConnected(clientid, userName);
return 400;
}
/**
* 远程调用另一个服务中的设备上线功能
* @param clientid
* @param userName
*/
private void publishConnected(String clientid, String userName) {
Connected connected = new Connected();
connected.setAction(ACTION);
connected.setClientid(clientid);
connected.setUsername(userName);
Date date = new Date();
connected.setConnected_at(date.getTime());
Map<String, Object> param = BeanUtil.beanToMap(connected, false, true);
String url = IotPropertiesConfig.HTTP_PREFIX + IotPropertiesConfig.IP_PORT+ UrlConstant.webHook_path;
String result = HttpUtils.postByRetry(url, param, IotPropertiesConfig.HTTP_TIMEOUT);
log.info("设备:{}上线内容的通知结果:{}",connected.getUsername(),result);
}
httpUtil工具类:
package com.setch.crodigy.utils;
import cn.hutool.http.HttpRequest;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.rholder.retry.*;
import com.google.common.base.Predicates;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
import java.util.concurrent.*;
/**
* 接口定制工具类
*/
@Slf4j
public class HttpUtils {
private static final String CONTENT_TYPE = "Content-Type";
private static final String AUTHORIZATION = "Authorization";
private static final String CONTENT_TYPE_VALUE = "application/x-www-form-urlencoded";
private static final String CONTENT_TYPE_VALUE_JSON = "application/json";
private static ObjectMapper json = new ObjectMapper();
private static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
//重试间隔
private static long sleepTime = 1L;
//重试次数
private static int attemptNumber = 5;
//设置重试机制
private final static Retryer<String> retryer = RetryerBuilder.<String>newBuilder()
.retryIfResult(Predicates.<String>isNull()) // 设置自定义段元重试源
.retryIfExceptionOfType(Exception.class) // 设置异常重试源
.retryIfRuntimeException() // 设置异常重试源
.withStopStrategy(StopStrategies.stopAfterAttempt(attemptNumber)) // 设置重试次数 设置重试超时时间????
.withWaitStrategy(WaitStrategies.fixedWait(sleepTime, TimeUnit.SECONDS)) // 设置每次重试间隔
.build();
/**
* 设备上线使用
* @param url
* @param paramMap
* @param timeout
*/
public static void deviceOnline(String url, Map<String, Object> paramMap, int timeout) {
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
postByRetry("",null,1);
}
});
}
/**
*
* @param url 访问路径
* @param paramMap 请求体
* @param timeout 超时时间 单位: 秒
* @return
* @throws JsonProcessingException
*/
public static String postByRetry(String url, Map<String, Object> paramMap, int timeout) {
Callable<String> task = new Callable<String>() {
int i = 0;
@Override
public String call() throws Exception {
i++;
if(i > 1){
log.info("请求初次执行失败,开始第{}次执行!", i);
}
String result = post(url, paramMap, timeout);
return result;
}
};
String res = "";
try {
//执行任务的重试,得到返回结果
res = retryer.call(task);
} catch (ExecutionException e) {
log.error("Post ExecutionException", e);
} catch (RetryException e) {
log.error("Post RetryException", e);
}
return res;
}
/**
*
* @param url 访问路径
* @param paramMap 请求体
* @param timeout 超时时间 单位: 秒
* @return
* @throws JsonProcessingException
*/
public static String post(String url, Map<String, Object> paramMap, int timeout) throws JsonProcessingException {
String map = json.writeValueAsString(paramMap);
String result = HttpRequest
.post(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE).timeout(timeout * 1000)
.body(map).execute().body();
return result;
}
/**
*
* @param url 访问路径
* @param map 请求体
* @param timeout 超时时间 单位: 秒
* @return
*/
public static String post(String url, String map, int timeout) {
String result = HttpRequest
.post(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE).timeout(timeout * 1000)
.body(map).execute().body();
return result;
}
/**
*
* @param url 访问路径
* @param map 请求体
* @param timeout 超时时间 单位: 秒
* @return
*/
public static String post(String url, String map, int timeout,String authorization) {
String result = HttpRequest
.post(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE).header(AUTHORIZATION,authorization)
.timeout(timeout * 1000)
.body(map).execute().body();
return result;
}
/**
*
* @param url 访问路径
* @param timeout 超时时间 单位: 秒
* @param authorization 认证token
*/
public static String get(String url, int timeout,String authorization) {
String result = HttpRequest.get(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE_JSON).header(AUTHORIZATION,authorization)
.timeout(timeout * 1000).execute().body();
return result;
}
/**
*
* @param url 访问路径
* @param timeout 超时时间 单位: 秒
* @param authorization 认证token
*/
public static String delete(String url, int timeout,String authorization ,String map) {
String result = HttpRequest.delete(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE_JSON).header(AUTHORIZATION,authorization)
.timeout(timeout * 1000).body(map).execute().body();
return result;
}
/**
*
* @param url 访问路径
* @param timeout 超时时间 单位: 秒
* @param authorization 认证token
*/
public static String delete(String url, int timeout,String authorization ) {
String result = HttpRequest.delete(url).header(CONTENT_TYPE,CONTENT_TYPE_VALUE_JSON).header(AUTHORIZATION,authorization)
.timeout(timeout * 1000).execute().body();
return result;
}
}
这里的publishConnectEd(clientid,userName);使用http远程调用另外一个服务中的设备上线的接口。
String url : 需要跳转的接口路径。(如:http://localhost:8080/user/login)
param: 远程调用时,所需参数。
HttpUtils.postByRetry() 实现http远程调用。
下面是需要被远程调用的接口
import antlr.StringUtils;
import com.setch.crodigy.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RequestMapping("/testDemo")
@RestController
public class ProductController {
@Autowired
private ProductService productService;
@PostMapping("/save")
@Transactional
public boolean saveProduct(@RequestBody Product product){
Product result = productService.save(product);
if (result != null){
return true;
}else {
return false;
}
}
}
以上是本人个人使用案例,测试成功,初次使用,若有问题欢迎大家提出指正。
希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/m0_55865810/article/details/123185931


猜你喜欢
- springmvc dao层和service层的区别首先解释面上意思,service是业务层,dao是数据访问层这个问题我曾经也有过,记得以
- 一、AtomicReference 基本使用我们这里再聊起老生常谈的账户问题,通过个人银行账户问题,来逐渐引入 AtomicReferenc
- 一、问题重现1.配置文件spring: #DataSource数据源 datasource: &nbs
- 用Java来实现简单的拼图游戏,供大家参考,具体内容如下首先我们看一下这个拼图小游戏的效果图:创建一个名称为MedleyGame的类,该类继
- 本文实例讲述了Java文件操作工具类fileUtil。分享给大家供大家参考,具体如下:package com.gcloud.common;i
- 本文旨在用通俗的语言讲述枯燥的知识定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时
- 一.线程不安全多线程的执行环境中,程序的执行结果和预期的结果不符合,这就称为发生了线程不安全现象二.那些情况导致了线程不安全?大致分为以下5
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 我们在设计layout的时候,使用Split视图,就是左侧是代码,右侧是设计图,但是我们忽视了最上方的工具栏,这里才是真正的宝藏。下面教大家
- 1.springboot 2.0 默认连接池就是Hikari了,所以引用parents后不用专门加依赖2.贴我自己的配置(时间单位都是毫秒)
- java 同步、异步、阻塞和非阻塞分析概要:正常情况下,我们的程序以同步非阻塞的方式在运行。但是我们的程序总会出现一些耗时操作,比如复杂的计
- 一、C++11智能指针概述在C++中,动态内存的使用时有一定的风险的,因为它没有垃圾回收机制,很容易导致忘记释放内存的问题,具体体现在异常的
- 首先:因为工作需要,需要对接socket.io框架对接,所以目前只能使用netty-socketio。websocket是不支持对接sock
- Spring3中加强了注解的使用,其中计划任务也得到了增强,现在创建一个计划任务只需要两步就完成了:创建一个Java类,添加一个无参无返回值
- Android安全加密专题文章索引Android安全加密:对称加密Android安全加密:非对称加密Android安全加密:消息摘要Mess
- 本文实例讲述了C#数据结构之堆栈(Stack)。分享给大家供大家参考,具体如下:堆栈(Stack)最明显的特征就是“先进后出”,本质上讲堆栈
- 原因:feign传值出错无法接收到传值由于是POST所以添加@RequestBody进行尝试解决:错误原因是未添加@RequestBody尝
- 标题Gradle构建问题切换到Project工程下.idea/gradle.xml添加属性<option name="del
- 开发前准备支付宝开发平台.支付宝沙箱环境申请使用!!!重点 授权回调地址必须要写全路径也就是controller最终路径(下面有具体细节)R
- 类和对象的关系类就是一类对象的统称。对象就是这一类具体化的一个实例。 (对象是类的实例化)对象是什么?此对象非彼对象!!!😂说到对象就要提到