您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 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:封装   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
命令模式:将请求封装为对象
什么是命令模式?命令模式是一种行为型设计模式,它将请求或操作封装成独立的命令对象。这些命令对象包括了执行操作所需的所有信息,例如操作方法、参数和接收者。命令模式允许...【详细内容】
2023-10-19  Search: 封装  点击:(259)  评论:(0)  加入收藏
Java内部类与匿名内部类:实现代码的封装与简化
Java内部类和匿名内部类是Java语言中的两种特殊类型的类。它们可以帮助我们实现代码的封装和简化,提高代码的可读性和可维护性。Java内部类是定义在另一个类内部的类,内部类可...【详细内容】
2023-10-19  Search: 封装  点击:(268)  评论:(0)  加入收藏
Springboot+Redisson封装分布式锁Starter
我们将分布式锁基于缓存扩展了一版,也就是说本starter即有分布式缓存功能,又有分布式锁功能。而注解版的分布式锁能够解决大多数场景的并核问题,小粒度的Lock锁方式补全其他场...【详细内容】
2023-08-28  Search: 封装  点击:(256)  评论:(0)  加入收藏
一次DOM曝光封装历程
随着最近曝光埋点的需求越来越频繁,就想把之前写好的曝光逻辑抽出来封装了一下作为公用。初版逻辑:window.scroll 监听滚动 + 使用 getBoundingClientRect() 相对于视口位置...【详细内容】
2023-08-02  Search: 封装  点击:(255)  评论:(0)  加入收藏
为何英伟达“独宠”台积电而非三星电子?封装技术才是王道
全球客户都在排着队购买英伟达的图形处理单元(GPU)。近年来,人工智能(AI)产业的快速发展推动了全球对GPU的需求,导致目前供不应求的局面。GPU可以被视作ChatGPT等生成式人工智能(AI...【详细内容】
2023-07-04  Search: 封装  点击:(69)  评论:(0)  加入收藏
App在线封装容易吗?是什么原理?
App在线封装是一种将网页应用封装成App的技术,通过这种技术,用户可以在不下载安装App的情况下,直接在浏览器中使用App的功能。相对于传统的App开发模式,App在线封装具有更低的开...【详细内容】
2023-06-30  Search: 封装  点击:(242)  评论:(0)  加入收藏
Vue3+Axios网络请求封装
Vue3是Vue.js框架的最新版本,它在语法、性能和开发体验等方面都进行了优化和改进。而Axios则是一个基于Promise的HTTP客户端,可以在浏览器和Node.js中使用。Axios可以帮助我们...【详细内容】
2023-05-30  Search: 封装  点击:(239)  评论:(0)  加入收藏
DOM怎么封装的?各种库是怎么写的?
DOM怎么封装的?各种库是怎么写的?(DOM库,AJAX库,动画 库,事件库)?在作用域套作用域的时候;子作用域内尽量不返回引用数据类型,因为闭包内的值,是另外一个子闭包的返回值的时候,如果子...【详细内容】
2023-05-19  Search: 封装  点击:(252)  评论:(0)  加入收藏
使用开源 Python API 封装器与你的集群对话
结合开放的 API 和 Python 编程语言的力量。围绕 API 创建封装器的开源项目正变得越来越流行。这些项目使开发人员更容易与 API 交互并在他们的应用中使用它们。openshift-p...【详细内容】
2023-05-08  Search: 封装  点击:(317)  评论:(0)  加入收藏
不要再封装各种Util工具类了,这个神级框架你值得拥有!
今天给大家推荐一个非常好用的Java工具类库,企业级常用工具类,基本都有,能避免重复造轮子及节省大量的开发时间,非常不错,值得大家去了解使用。Hutool谐音 “糊涂”,寓意追求 “万...【详细内容】
2023-02-27  Search: 封装  点击:(252)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(18)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(25)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(34)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(63)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(78)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(78)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(100)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(111)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(108)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(82)  评论:(0)  加入收藏
站内最新
站内热门
站内头条