您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

「SpringBoot」 Java中如何封装Http请求

时间:2022-08-05 16:16:03  来源:  作者:MQ Home

前言

本文中的内容其实严格来说不算springboot里面的特性,属于JAVA基础,只是我在项目中遇到了,特归纳总结一下。

HTTP请求封装

目前JAVA对于HTTP封装主要有三种方式:

  1. JAVA原生封装

  2. HttpClient 3.X /HttpClient4.X

  3. Spring RestTemplate

http请求过程如下:

GET:1、创建远程连接2、设置连接方式(get、post、put。。。)3、设置连接超时时间4、设置响应读取时间5、发起请求6、获取请求数据7、关闭连接POST:1、创建远程连接2、设置连接方式(get、post、put。。。)3、设置连接超时时间4、设置响应读取时间5、当向远程服务器传送数据/写数据时,需要设置为true(setDoOutput)6、当前向远程服务读取数据时,设置为true,该参数可有可无(setDoInput)7、设置传入参数的格式:(setRequestProperty)8、设置鉴权信息:Authorization:(setRequestProperty)9、设置参数10、发起请求11、获取请求数据12、关闭连接

JAVA原生:

/** * http get请求 * @param httpUrl 链接 * @return 响应数据 */public static String doGet(String httpUrl){        //链接        HttpURLConnection connection=null;        InputStream is=null;        BufferedReader br = null;        StringBuffer result=new StringBuffer();        try {            //创建连接            URL url=new URL(httpUrl);            connection= (HttpURLConnection) url.openConnection();            //设置请求方式            connection.setRequestMethod("GET");            //设置连接超时时间            connection.setConnectTimeout(15000);            //设置读取超时时间            connection.setReadTimeout(15000);            //开始连接            connection.connect();            //获取响应数据            if(connection.getResponseCode()==200){                //获取返回的数据                is=connection.getInputStream();                if(is!=null){                    br=new BufferedReader(new InputStreamReader(is,"UTF-8"));                    String temp = null;                    while ((temp=br.readLine())!=null){                        result.Append(temp);                    }                }            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally {            if(br!=null){                try {                    br.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if(is!=null){                try {                    is.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            connection.disconnect();// 关闭远程连接        }        return result.toString();    }    /**     * post请求     * @param httpUrl 链接     * @param param 参数     * @return     */    public static String doPost(String httpUrl, @Nullable String param) {        StringBuffer result=new StringBuffer();        //连接        HttpURLConnection connection=null;        OutputStream os=null;        InputStream is=null;        BufferedReader br=null;        try {            //创建连接对象            URL url=new URL(httpUrl);            //创建连接            connection= (HttpURLConnection) url.openConnection();            //设置请求方法            connection.setRequestMethod("POST");            //设置连接超时时间            connection.setConnectTimeout(15000);            //设置读取超时时间            connection.setReadTimeout(15000);            //设置是否可读取            connection.setDoOutput(true);            //设置响应是否可读取            connection.setDoInput(true);            //设置参数类型            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");            //拼装参数            if(param!=null&&!param.equals("")){                //设置参数                os=connection.getOutputStream();                //拼装参数                os.write(param.getBytes("UTF-8"));            }            //设置权限            //设置请求头等            //开启连接            //connection.connect();            //读取响应            if(connection.getResponseCode()==200){                is=connection.getInputStream();                if(is!=null){                    br=new BufferedReader(new InputStreamReader(is,"UTF-8"));                    String temp=null;                    if((temp=br.readLine())!=null){                        result.append(temp);                    }                }            }            //关闭连接        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally {            if(br!=null){                try {                    br.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if(os!=null){                try {                    os.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if(is!=null){                try {                    is.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            //关闭连接            connection.disconnect();        }        return result.toString();    }

HttpCLient4.X

httpclient有很多版本,目前最新的版本是4.X了,所以推荐使用4.x的方式进行封装

public static String doGet(String url) {        CloseableHttpClient httpClient = null;        CloseableHttpResponse response = null;        String result = "";        try {            // 通过址默认配置创建一个httpClient实例            httpClient = HttpClients.createDefault();            // 创建httpGet远程连接实例            HttpGet httpGet = new HttpGet(url);            // 设置请求头信息,鉴权            httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");            // 设置配置请求参数            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间                    .setConnectionRequestTimeout(35000)// 请求超时时间                    .setSocketTimeout(60000)// 数据读取超时时间                    .build();            // 为httpGet实例设置配置            httpGet.setConfig(requestConfig);            // 执行get请求得到返回对象            response = httpClient.execute(httpGet);            // 通过返回对象获取返回数据            HttpEntity entity = response.getEntity();            // 通过EntityUtils中的toString方法将结果转换为字符串            result = EntityUtils.toString(entity);        } catch (ClientProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } finally {            // 关闭资源            if (null != response) {                try {                    response.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if (null != httpClient) {                try {                    httpClient.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return result;    }    public static String doPost(String url, Map<String, Object> paramMap) {        CloseableHttpClient httpClient = null;        CloseableHttpResponse httpResponse = null;        String result = "";        // 创建httpClient实例        httpClient = HttpClients.createDefault();        // 创建httpPost远程连接实例        HttpPost httpPost = new HttpPost(url);        // 配置请求参数实例        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间                .setConnectionRequestTimeout(35000)// 设置连接请求超时时间                .setSocketTimeout(60000)// 设置读取数据连接超时时间                .build();        // 为httpPost实例设置配置        httpPost.setConfig(requestConfig);        // 设置请求头        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");        // 封装post请求参数        if (null != paramMap && paramMap.size() > 0) {            List<NameValuePair> nvps = new ArrayList<NameValuePair>();            // 通过map集成entrySet方法获取entity            Set<Entry<String, Object>> entrySet = paramMap.entrySet();            // 循环遍历,获取迭代器            Iterator<Entry<String, Object>> iterator = entrySet.iterator();            while (iterator.hasNext()) {                Entry<String, Object> mapEntry = iterator.next();                nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));            }            // 为httpPost设置封装好的请求参数            try {                httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));            } catch (UnsupportedEncodingException e) {                e.printStackTrace();            }        }        try {            // httpClient对象执行post请求,并返回响应参数对象            httpResponse = httpClient.execute(httpPost);            // 从响应对象中获取响应内容            HttpEntity entity = httpResponse.getEntity();            result = EntityUtils.toString(entity);        } catch (ClientProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } finally {            // 关闭资源            if (null != httpResponse) {                try {                    httpResponse.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if (null != httpClient) {                try {                    httpClient.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return result;    }

Spring RestTemplate 封装HTTP

spring自带的一种封装模式,方便简洁,推荐使用

public static String httpGet(String url){        RestTemplate restTemplate=new RestTemplate();        String result=restTemplate.exchange(url, HttpMethod.GET,null,String.class).getBody();        return result;    }    public static String httpPost(String url,String name){        RestTemplate restTemplate=new RestTemplate();        return restTemplate.postForEntity(url,name,String.class).getBody();    }

HTTPS请求的封装

https请求只是在http请求的基础上面添加了SSL验证,通过下面的SLLClient 封装即可,调用的时候:

httpClient = SSLClient.createSSLClientDefault();

public class SSLClient {    public static CloseableHttpClient createSSLClientDefault(){        try {            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {                //信任所有                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {                    return true;                }            }).build();            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);            return HttpClients.custom().setSSLSocketFactory(sslsf).build();        } catch (KeyManagementException e) {            e.printStackTrace();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (KeyStoreException e) {            e.printStackTrace();        }        return  HttpClients.createDefault();    }}

JSON多层嵌套

处理接口返回的时候,目前用得最多的方式是返回json格式,因为json格式比较成熟,包括取值,实例化等等。这里介绍一种后端处理json返回多层嵌套的方式:

1. 实例化json数据

2. 请求Http 接口获取返回值

3. 实例化返回值并获取你想要的key或者value,或者做验证都行

优点: 实例化了数据结构,想获取任何数据都能使用实例化的方法。不用理会它有几层,它的数据结构是什么(List, array, string等等)

缺点: 需要返回的数据结构稳定,不能返回变动的数据结构, 另外实例化有一定的代码量,比较繁琐(但是有固定插件解决)

实操:

1. IDEA ---settings-----install plugins----GSON 插件

2. 新增一个entity实体类,在新建的实体类使用alt+S 快捷键打开GSON插件

3. 输入你想要实例化的JSON数据,一直下一步即可完成实例化。

实例化截图:

 

Service层调用实例化:

//实例化的时候注意数据格式,List的话可以循环获取(下面的注释部分);最终存储到map里面返回   Gateway gatewaydata = JSON.parseobject(res, Gateway.class);        Map<String,String> resMap=new HashMap<>();        String value=gatewaydata.getComponent().getMeasures().get(0).getPeriods().get(0).getValue();        String metric=gatewaydata.getComponent().getMeasures().get(0).getMetric();        //获取各个区的名称//        List<Country> clist=state.getData().get(0).getCity().get(0).getCounty();//        for(Country c:clist){//            System.out.println("cname:"+c.getName());//        }        System.out.println(value+metric);        resMap.put("metric",metric);        resMap.put("value",value);


Tags:封装   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言本文中的内容其实严格来说不算springboot里面的特性,属于JAVA基础,只是我在项目中遇到了,特归纳总结一下。HTTP请求封装目前JAVA对于HTTP封装主要有三种方式:  1. JAVA原...【详细内容】
2022-08-05  Tags: 封装  点击:(0)  评论:(0)  加入收藏
前言基于http协议,最常用的是GET和POST两种方法。接口文档需要包含哪些信息: 接口名称 接口功能 接口地址 支持格式 json/xml 请求方式 请求示例 请求参数(是否必填、数据类型...【详细内容】
2022-07-22  Tags: 封装  点击:(23)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  Tags: 封装  点击:(43)  评论:(0)  加入收藏
在后端并不是写完一个接口的业务逻辑就能投入使用的,接口的优化更是一个难点与麻烦之处(下面的内容我们不考虑前端的处理,因为不能完全靠前端,前后端都需要做自己的处理工作)1.幂...【详细内容】
2022-07-05  Tags: 封装  点击:(46)  评论:(0)  加入收藏
前置掌握:SpringBoot基础使用、RocketMQ和SpringBoot的整合使用源码地址:gitee.com/tianxincode&hellip; 文章只会说明核心代码,其他的基础整合配置和多环境自动隔离参考源码即...【详细内容】
2022-06-22  Tags: 封装  点击:(47)  评论:(0)  加入收藏
在实际项目开发过程中、事实上我们经常用@restcontroller注释的方式,将相当于将返回数据的基本形式统一为JSON格式的数据。但是,由于我们的项目可能是由很多人开发的,所以我们...【详细内容】
2022-06-14  Tags: 封装  点击:(66)  评论:(0)  加入收藏
讲故事前几天看公司一个新项目使用了FluentValidation,大家都知道FluentValidation是一个非常强大的用于构建强类型验证规则的 .NET 框架,帮程序员解决了繁琐的校验问题,用起来...【详细内容】
2022-06-08  Tags: 封装  点击:(68)  评论:(0)  加入收藏
源码目录 在src目录下建立一个request文件夹。里面建立两个文件: http.js api.js 源码内容 http.js import axios from &#39;axios&#39; // 引入axios import store from &#3...【详细内容】
2022-06-02  Tags: 封装  点击:(46)  评论:(0)  加入收藏
一、视频播放器原理音视频技术主要包含以下几点:封装技术​、​视频压缩编码技术​ 以及 ​音频压缩编码技术。如果考虑到网络传输的话,还包括流媒体协议技术。简要说明一下视...【详细内容】
2022-05-27  Tags: 封装  点击:(115)  评论:(0)  加入收藏
一、封装前准备的工具 视频教程下载: https://pan.baidu.com/s/1kVPuKCn1、安装Windows7官方发布的安装光盘镜像最好是旗舰版。2、需要预装的各种应用软件,如Office、QQ、解...【详细内容】
2022-04-08  Tags: 封装  点击:(74)  评论:(0)  加入收藏
▌简易百科推荐
前言本文中的内容其实严格来说不算springboot里面的特性,属于JAVA基础,只是我在项目中遇到了,特归纳总结一下。HTTP请求封装目前JAVA对于HTTP封装主要有三种方式:  1. JAVA原...【详细内容】
2022-08-05  MQ Home    Tags:封装   点击:(0)  评论:(0)  加入收藏
深入理解Java IO流2022-08-05 09:04&middot;Java开发技术分享目录1.字符输入流BufferedReader2.字符输出流BufferedWriter聾缓冲流(1)带有缓冲区的字符输入流;使用这个流的时候...【详细内容】
2022-08-05  Java开发技术分享    Tags:IO流   点击:(0)  评论:(0)  加入收藏
Java集合框架一、Java集合框架概述 1、数组与集合的区别:1) 数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。2)...【详细内容】
2022-08-03  Java开发技术分享    Tags:Java   点击:(5)  评论:(0)  加入收藏
这两天一直在准备面试,看了很多篇关于锁的介绍的博客,今天就总结一下。首先需要知道几个名词: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 ...【详细内容】
2022-08-03  IT道阻且长    Tags:Java锁   点击:(6)  评论:(0)  加入收藏
Java中的抽象类与接口在Java中什么时候应该选择抽象类而不是接口?接受挑战吧!了解这些Java语言元素之间的区别以及如何在你的程序中使用它们。在Java代码中,甚至在Java开发工...【详细内容】
2022-08-02  Java非凡    Tags:抽象类   点击:(12)  评论:(0)  加入收藏
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命令,如jps、jstack、jmap、j...【详细内容】
2022-08-01  扣钉日记    Tags:jcmd   点击:(7)  评论:(0)  加入收藏
【1】socket服务器/** * @Description 即时消息服务器 * @author xiao tang * @version 1.0.0 * @createTime 2022年01月23日 */public class IMSocketServer { private...【详细内容】
2022-08-01  杂文论    Tags:即时通讯   点击:(5)  评论:(0)  加入收藏
前言既然要学习一门技术,那么就先来了解下它的历史,我们为什么要使用它,以及我们能用它来干啥。历史背景1990 年代初,Sun 公司的詹姆斯&middot;高斯林等人为了实现电视机、电话...【详细内容】
2022-07-31  村雨遥    Tags:Java   点击:(8)  评论:(0)  加入收藏
/*** Stack类extends Vector 栈容器* 扩充了五个方法 push() peek() pop() empty() search()* 栈中的方法遵循后进先出 main方法需要等所有方法执行完弹出后才会弹出 方法的...【详细内容】
2022-07-30  虚云幻仙    Tags:   点击:(10)  评论:(0)  加入收藏
1. 介绍JAVA作为使用的主力语言,掌握下其历史发展也是有必要的。看看从JAVA5开始到现在的JAVA9有哪些变化。借此机会,也可以看看哪些特性我们是已经用到的,哪些是还没有用到的...【详细内容】
2022-07-30  未影P  简书  Tags:java   点击:(14)  评论:(0)  加入收藏
站内最新
站内热门
站内头条