记RestTemplate使用,简单优雅的调用http接口_如何编写一个客户端和服务端并整合http调用restremplate-程序员宅基地

技术标签: java  

客户端代码,有问题欢迎指出,新手

package com.qc.exp.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;
import java.util.Date;
import java.util.Map;

/**
 * @Author by qingcheng
 * @Date 2019/11/8 13:51
 * @Description 使用RestTemplate简单调用http接口,bean与json的转换默认依赖jackson
 */
public class RestClient {
    

    // ===================================================================================================
    // 常量
    // 日志记录器
    private static final Logger logger = LoggerFactory.getLogger(RestClient.class);
    // 默认字符编码集
    private static final Charset DEFAULT_CHARSET = Charset.defaultCharset();

    // ===================================================================================================
    // 属性
    /**
     * 默认字符编码集
     */
    private Charset charset = DEFAULT_CHARSET;

    private final RestTemplate template;

    // ===================================================================================================
    // 构造
    private RestClient() {
    
        template = new RestTemplate();
    }

    public static RestClient getInstance() {
    
        return SingletonBuilder.INSTANCE.getInstance();
    }

    private enum SingletonBuilder {
    
        INSTANCE;

        private RestClient client;

        SingletonBuilder() {
    
            client = new RestClient();
        }

        public RestClient getInstance() {
    
            return client;
        }
    }
    // ===================================================================================================
    // 方法
    /**
     * get请求接口返回对象,使用默认编码格式
     */
    public <R> R getObject(String url, Map<String, Object> params, Class<R> bean) {
    
        return getObject(url, params, bean, this.charset);
    }

    /**
     * get请求接口返回对象
     */
    public <R> R getObject(String url, Map<String, Object> params, Class<R> bean, String charset) {
    
        Assert.hasText(charset, "编码格式不可为空");
        return getObject(url, params, bean, Charset.forName(charset));
    }

    /**
     * TODO get请求接口返回对象
     *
     * @param url     接口地址
     * @param params  请求参数
     * @param bean    返回bean类型
     * @param charset 编码格式
     * @return 接口响应
     */
    public <R> R getObject(String url, Map<String, Object> params, Class<R> bean, Charset charset) {
    

        Assert.notNull(charset, "编码格式不可为空");
        template.getMessageConverters().add(1, new StringHttpMessageConverter(charset));

        logger.debug("> 请求接口Method.GET:[{}]:url:[{}]:[{}], Charset:{}", String.format("%tF %1$tT.%1$tL", new Date()), url, params, this.charset);
        long st = System.currentTimeMillis();

        R re = null;
        try {
    
            if (params != null && params.size() > 0) {
    
                re = template.getForObject(url, bean, params);
            } else {
    
                re = template.getForObject(url, bean);
            }
        } catch (RestClientException e) {
    
            logger.error("> 请求异常:Url:" + url, e);
        }

        long ed = System.currentTimeMillis();
        logger.debug("> 请求成功:[{}],耗时:{}", re, ed - st);

        return re;
    }

    /**
     * post请求json接口
     */
    public <P, R> R postJson(String url, P param, Class<R> bean) {
    
        return postJson(url, param, bean, this.charset);
    }

    /**
     * post请求json接口
     */
    public <P, R> R postJson(String url, P param, Class<R> bean, String charset) {
    
        Assert.hasText(charset, "编码格式不可为空");
        return postJson(url, param, bean, Charset.forName(charset));
    }

    /**
     * TODO post请求json接口
     */
    public <P, R> R postJson(String url, P param, Class<R> bean, Charset charset) {
    
        return post(url, param, bean, charset, MediaType.APPLICATION_JSON);
    }

    /**
     * post提交from表单,使用默认编码格式
     */
    public <P, R> R postFrom(String url, P param, Class<R> bean) {
    
        return postFrom(url, param, bean, this.charset);
    }

    /**
     * post提交from表单
     */
    public <P, R> R postFrom(String url, P param, Class<R> bean, String charset) {
    
        Assert.hasText(charset, "编码格式不可为空");
        return postFrom(url, param, bean, Charset.forName(charset));
    }

    /**
     * TODO post提交from表单,并接收返回对象
     */
    public <P, R> R postFrom(String url, P param, Class<R> bean, Charset charset) {
    
        return post(url, param, bean, charset, MediaType.APPLICATION_FORM_URLENCODED);
    }

    /**
     * post请求
     */
    public <P, R> R post(String url, P param, Class<R> bean) {
    
        return post(url, param, bean, this.charset, (HttpHeaders) null);
    }

    /**
     * post请求
     */
    public <P, R> R post(String url, P param, Class<R> bean, String charset) {
    
        Assert.hasText(charset, "编码格式不可为空");
        return post(url, param, bean, Charset.forName(charset), (HttpHeaders) null);
    }

    /**
     * post请求
     */
    public <P, R> R post(String url, P param, Class<R> bean, Charset charset) {
    
        return post(url, param, bean, charset, (HttpHeaders) null);
    }

    /**
     * post请求
     *
     * @param mediaType ContentType请求上下文类型
     */
    public <P, R> R post(String url, P param, Class<R> bean, Charset charset, MediaType mediaType) {
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(mediaType);
        return post(url, param, bean, charset, headers);
    }

    /**
     * TODO post请求
     *
     * @param url     接口地址
     * @param param   表单数据
     * @param bean    返回bean类型
     * @param charset 编码格式
     * @param headers 请求头部
     * @param <P>     入参
     * @param <R>     出参
     * @return
     */
    public <P, R> R post(String url, P param, Class<R> bean, Charset charset, HttpHeaders headers) {
    

        Assert.notNull(charset, "编码格式不可为空");
        template.getMessageConverters().add(1, new StringHttpMessageConverter(charset));

        HttpEntity<P> requestEntity = new HttpEntity<>(param, headers);

        long st = System.currentTimeMillis();
        logger.debug("> 请求接口Method.POST:[{}]:url:[{}]:[{}], Charset:{}", String.format("%tF %1$tT.%1$tL", new Date(st)), url, param, this.charset);

        R re = null;
        try {
    
            re = template.postForObject(url, requestEntity, bean);
        } catch (RestClientException e) {
    
            logger.error("> 请求异常:Url:" + url, e);
        }

        long ed = System.currentTimeMillis();
        logger.debug("> 请求完成:[{}],耗时:{}", re, ed - st);

        return re;
    }

    public void setCharset(String charset) {
    
        this.charset = Charset.forName(charset);
    }

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33786270/article/details/103280702

智能推荐

STM32流水灯仿真-程序员宅基地

目录一、编程1.新建工程二、仿真1.创建工程2.添加器件连接电路图3.将流水灯.hex导入芯片4.运行仿真一、编程1.新建工程新建文件夹并命名,在此文件夹下建立user,cmsis,stdlib,mdk等子文件夹user用于存放工程文件和用户层代码,包括主函数main.cstdlib用于存放STM32库里的inc和src文件夹,它们包含了芯片上所有的驱动cmsis用于存放库自带的启动文件和一些位于cmsis层的文件接下来打开Keil,新建工程和组,将对应的文件添加到对应的文件夹中点击工

zynq配置成jtag模式_浅谈ZYNQ的三种启动方式-JTAG、SD card、Flash-程序员宅基地

前言:前面我们都是使用JTAG方式下载比特流文件,然后下载elf文件,最后点击Runas或者Debugas来运行程序。JTAG方式是通过tcl脚本来初始化PS,然后用JTAG收发信息,优点是可以在线调试,缺点是断电后程序就丢失了。为了解决程序丢失的问题,可以制作镜像文件烧写到sd卡或者flash中,上电即可加载程序。ZYNQ有两大类启动模式:从BootROM主动启动,从JTAG被动启动。在没有外部..._zynq jtag

搭建双塔 DP问题_双塔dp-程序员宅基地

描述2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔。Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭_双塔dp

mysql通过select查询出来的记录插入到数据表_select查询然后在英插入数据-程序员宅基地

格式: insert into 表A(A表某个字段/全部字段)(select 的语句)重点:select 的语句的结果集 必须是A表某个字段/全部字段的值(但字段名称可以对应,毕竟要是只是select的结果)举一个栗子:INSERT INTO bid_project ( id, bidProjectName, bidProjectAddress, landA..._select查询然后在英插入数据

十道海量数据处理面试题与十个方法大总结-程序员宅基地

来自:http://blog.csdn.net/v_JULY_v/article/details/6279498、 海量数据处理:十道面试题与十个海量数据处理方法总结作者:July、youwang、yanxionglu。时间:二零一一年三月二十六日本文之总结:教你如何迅速秒杀掉:99%的海量数据处理面试题。有任何问题,欢迎随时交流、指正。出处:http://blog.c

python—gc.collect()清楚内存_gc.collect() python_哎呦-_-不错的博客-程序员宅基地

import osgc.collect()作用清楚内存,尽量避免主动调用gc.collect()除非当你new出一个大对象,使用完毕后希望立刻回收,释放内存想详细了解的,参考这篇博客_gc.collect() python

随便推点

XMLHTTP vs ServerXMLHTTP_csdn xmlhttpserver-程序员宅基地

XMLHTTP vs ServerXMLHTTP XMLHTTPServerXMLHTTP1Works on Windows 98, 95 and MERequires at least Windows NT 4 with IE5.01 .2 Does not have a means of waiting for an async call other than using another t_csdn xmlhttpserver

spring boot 使用 undertow 替换tomcat web容器_server.undertow.threads.io-程序员宅基地

spring boot 默认使用tomcat web容器1.需要移除tomcat依赖 pom.xml 中配置。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion>._server.undertow.threads.io

PHP获取不重复的5个随机字符_php生成5个a-程序员宅基地

PHP获取不重复的5个随机字符public function random_str(){ //获取随机0-9,a-Z的随机5个不重复的字符 $menber = range('0','9'); //获取0-9的数据 $lowercase = range('a','z'); //获取a-z的数据 $uppercase _php生成5个a

Java笔试面试-设计模式_笔试写设计模式-程序员宅基地

1.说一下设计模式?你都知道哪些?答:设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )。  ①创建型模式( Creational Patterns ):工厂模式(Factory pattern)抽象工厂模式(Abst..._笔试写设计模式

sqlserver数据库备份与还原_sqlserver norecovery-程序员宅基地

一丶数据库备份BACKUP DATABASE {database_name | @database_name_var } --数据库名TO &lt; backup_device&gt; [ ,...n ] --备份到磁盘地址,bak格式是备份文件格式//各种属性 [ WITH [BLOCKSIZE = { blocksize | @blocksize_variable } ] [ ..._sqlserver norecovery

执行力是改变人生最直接有效的方法,没有之一-程序员宅基地

那些能够超越同龄人的人,往往都有这样一个优点,他们除了有远见外,还特别肯吃苦,他们的勤奋和执行力往往能甩出同龄人几条街。缺乏执行力,人就会焦虑、迷茫。执行力是改变人生最直接有效的方法,没有之一。当员工哀叹老板一直没有给自己涨工资,现在的工作不适合自己发展时,我们付出了多少行动?一个人在舒适的环境待久了,无论他多么想改变,如果他不去执行,最终都很难取得大的成就。马云有一句非...