SpringBoot Http远程调用的方法


Posted in Java/Android onAugust 14, 2022

本文实例为大家分享了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;
        }
    }
}

以上是本人个人使用案例,测试成功,初次使用,若有问题欢迎大家提出指正。

希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
springboot @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
Feign调用全局异常处理解决方案
Jun 24 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
在Spring-Boot中如何使用@Value注解注入集合类
Aug 02 Java/Android
详解Java七大阻塞队列之SynchronousQueue
Sep 04 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
关于maven依赖 ${xxx.version}报错问题
Jan 18 Java/Android
Spring this调用当前类方法无法拦截的示例代码
Mar 20 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
springboot入门 之profile设置方式
Apr 04 Java/Android
Spring Boot 实现 WebSocket
Apr 30 Java/Android
基于Android10渲染Surface的创建过程
Aug 14 #Java/Android
OpenFeign实现远程调用
Aug 14 #Java/Android
httpclient调用远程接口的方法
Aug 14 #Java/Android
Java Spring读取和存储详细操作
Aug 05 #Java/Android
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
Aug 05 #Java/Android
Java代码规范与质量检测插件SonarLint的使用
Aug 05 #Java/Android
Spring boot admin 服务监控利器详解
Aug 05 #Java/Android
You might like
PHP下10件你也许并不了解的事情
2008/09/11 PHP
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
React 父子组件通信的实现方法
2019/12/05 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
python从sqlite读取并显示数据的方法
2015/05/08 Python
Python实现高效求解素数代码实例
2015/06/30 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
python解包概念及实例
2021/02/17 Python
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
资深财务管理人员自我评价
2013/09/22 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
春节联欢会策划方案
2014/05/16 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
承诺书应该怎么写?
2019/09/10 职场文书