浅谈外部接口调用httpClient原生方式进一步使用与各个涉及类含义及作用

本文详细介绍如何使用Java标准库HttpURLConnection及Apache HttpClient发起HTTP请求。包括建立连接、设置参数、发送请求、处理响应等步骤,并对比两种方式的不同。

前言

上篇文章提到的几种调用外部接口的方式,此处针对原生httpClient方式做进一步的案例展示以及步骤讲解,同时对上篇文章中提到的原生方式中的涉及类做相应解释

原生HttpClient的详细使用案例

步骤

新建HttpURLConnection 连接

任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。HttpURLConnection只能通过URL.openConnection()方法创建具体的实例。

 			URL url = new URL(httpUrl);
            // 通过远程url连接对象打开连接
            connection = (HttpURLConnection) url.openConnection();

设置连接参数(请求方式、超时时间)

            // 设置连接请求方式
            connection.setRequestMethod("POST");
            // 设置连接主机服务器超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取主机服务器返回数据超时时间:60000毫秒
            connection.setReadTimeout(60000);

向连接中写入请求参数

  • setRequestProperty()方法严格上讲是HttpURLConnection的父类—URLConnection的方法,而URL.openConnection()返回的是一个URLConnection对象,而一般我们都用他的子类HttpURLConnection去做连接和网络传输工作。
  • setRequestProperty和addRequestProperty的区别就是setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。
            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
            connection.setDoOutput(true);
            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
            connection.setDoInput(true);
            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
            //   connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        	//请求头参数
            connection.setRequestProperty("Content-Type", "application/json");
            //apaas平台请求头参数,请求参数会过时
            //租户ID
            connection.setRequestProperty("xdaptenantid","300981605114052609");
            //时间戳
            connection.setRequestProperty("xdaptimestamp","1663469009699");
            //token
            connection.setRequestProperty("xdaptoken","eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NjMwOTM0NjMsImlhdCI6MTY2MzA4NjI2MywieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.LnlNIRUXdpW4UTjCgv57Fx8ar4xD7aoyCnDhL4WpCe9kopVF72PNNx8ob6V-iFfeMp8P70hCpl8XhyxxtLo-vg");
            // 通过连接对象获取一个输出流
            os = connection.getOutputStream();
            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
            os.write(param.getBytes());
            // 通过连接对象获取一个输入流,向远程读取(此处是判断返回状态为200时读取返回信息并打印)

读取连接返回结果

				//获取连接
				is = connection.getInputStream();
                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                StringBuffer sbf = new StringBuffer();
                String temp = null;
                // 循环遍历一行一行读取数据
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();

关闭io连接

 // 关闭资源,如果该流存在则做关闭操作
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

断开url连接

虽然底层的网络连接可以被多个HttpURLConnection实例共享,但每一个HttpURLConnection实例只能发送一个请求。请求结束之后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化连接没用。对于持久化连接,得用disconnect()方法关闭底层连接的socket。

// 断开与远程地址url的连接
            connection.disconnect();

完整代码

public static String doPost(String httpUrl, String param) {

        HttpURLConnection connection = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        String result = null;
        try {
            URL url = new URL(httpUrl);
            // 通过远程url连接对象打开连接
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接请求方式
            connection.setRequestMethod("POST");
            // 设置连接主机服务器超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取主机服务器返回数据超时时间:60000毫秒
            connection.setReadTimeout(60000);

            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
            connection.setDoOutput(true);
            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
            connection.setDoInput(true);
            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
         //   connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

         //   setRequestProperty()方法严格上讲是HttpURLConnection的父类---URLConnection的方法,而URL.openConnection()返回的是一个URLConnection对象,而一般我们都用他的子类HttpURLConnection去做链接和网络传输工作
            connection.setRequestProperty("Content-Type", "application/json");
            // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
       //     connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");

            //apaas平台请求头参数
            //租户ID
            connection.setRequestProperty("xdaptenantid","300981605114052609");
            //时间戳
            connection.setRequestProperty("xdaptimestamp","1663469009699");
            //token
            connection.setRequestProperty("xdaptoken","eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NjMwOTM0NjMsImlhdCI6MTY2MzA4NjI2MywieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.LnlNIRUXdpW4UTjCgv57Fx8ar4xD7aoyCnDhL4WpCe9kopVF72PNNx8ob6V-iFfeMp8P70hCpl8XhyxxtLo-vg");
            // 通过连接对象获取一个输出流
            os = connection.getOutputStream();
            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
            os.write(param.getBytes());
            // 通过连接对象获取一个输入流,向远程读取(此处是判断返回状态为200时读取返回信息并打印)
            if (connection.getResponseCode() == 200) {

                is = connection.getInputStream();
                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

                StringBuffer sbf = new StringBuffer();
                String temp = null;
                // 循环遍历一行一行读取数据
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源,如果该流存在则做关闭操作
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 断开与远程地址url的连接
            connection.disconnect();
        }
        return result;
    }

另一种写法

(此处上篇博客中提到的原生httpClient方法中的涉及类的相关解释)

代码&相关类解释

		//CloseableHttpClient是HttpClient的实现
        CloseableHttpClient client = HttpClients.createDefault();
        //封装了URI与METHOD_NAME请求方式以及请求体
        HttpPost post = new HttpPost(url);
        String response1 = null;
        try {
            //创建请求体并添加请求参数数据(此处请求体相当于封装了我们在原生httpClient.doPost中向连接中写入请求参数,包含请求参数的格式设置如下)
            StringEntity s = new StringEntity(date);
            //此处相当于在header里头添加content-type等参数(源码)(此处不做该参数覆盖的话会默认选择 text/plain ISO-8859-1)
            s.setContentType("application/json");
            s.setContentEncoding("UTF-8");
            //设置请求体
            post.setEntity(s);
            //post请求添加请求头参数
            post.addHeader("xdaptoken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2NjM0NzYxOTYsImlhdCI6MTY2MzQ2ODk5NiwieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.1dQA7AbOmhGQ2QRwRfi6qIjosKPj9AN34Keyu68chkLIOmsER0j5m_zq6x9VQvn-hrSyNuGaI6qJHtqjpTRTZw");
            post.addHeader("xdaptimestamp", "1663470853986");
            post.addHeader("xdaptenantid", "300981605114052609");
            //HttpResponse类表示web服务端发送回浏览器的HTTP响应,是对浏览器所发送请求的响应。
            HttpResponse res = client.execute(post);
            //为HttpEntity对象提供的静态帮助类,EntityUtils.toString(entity)处理字符集编码问题。
            //此处多嵌套了一层函数(源码).toString(res.getEntity())会去调用重载方法entityutils.tostring(httpresponse.getentity(),charset)从而去处理字符集编码问题
            response1 = EntityUtils.toString(res.getEntity());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return response1;

注意事项

  • 结束时注意断开连接同时关闭输入输出流
  • 注意使用setRequestProperty()与使用addRequestProperty的区别
  • StringEntity注意设置ContentType与ContentEncoding,相当于在header里头添加content-type等参数(此处不做该参数覆盖的话会默认选择 text/plain ISO-8859-1)

总结

HttpURLConnection 与 CloseableHttpClient 的区别如下:

  • HttpURLConnection是java的标准类,没有做封装,用起来比较原始。
  • HttpClient是开源框架,封装了访问HTTP的请求头、参数、内容体、响应等;HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse。这样,减少了操作的繁琐性。
<think>首先,用户的问题是将尚硅谷大数据4.0课程内容转化为公司电商项目介绍。这可能是为了求职或内部汇报,需要包装成一个真实项目的经验。 从系统级指令看,我需要: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 用户提供的引用: - [^1]: 关于数仓搭建-ODS层的资源链接。 - [^2]: 关于实时计算和DWS层的需求梳理。 - [^3]: 关于ADS层的描述。 - [^4]: 关于电商推荐系统的笔记。 这些引用是关于大数据仓库项目的,特别是尚硅谷的电商数仓V4.0课程。用户想包装成公司项目介绍。 我的回答应该结构清晰,逐步指导如何转化。可能包括: 1. 理解课程内容。 2. 重述为公司项目经验。 3. 添加实际细节以使其真实。 4. 突出关键技术和成果。 最后,生成相关问题。 大纲回答: 1. **引言**:解释转化的重要性。 2. **步骤1:梳理课程内容**:总结关键模块如ODS、DWS、ADS层。 3. **步骤2:重述为公司项目**:使用公司背景、角色、目标。 4. **步骤3:添加真实细节**:如具体数据、技术栈、成果。 5. **步骤4:展示示例项目介绍**。 6. **相关问题**:生成相关问题。 确保引用: - 在相关部分末尾添加引用标识。例如,提到ODS层时引用[^1]。 使用中文。 数学表达式:如果有数学内容,用LaTeX格式。但在这个主题中,可能没有太多数学,但如果有变量或方程,就用$...$。 例如,如果提到算法,如推荐系统中的ALS,可以用$ALS$表示。 生成相关问题:在回答结束时,添加"§§相关问题§§"部分。</think>### 如何将尚硅谷大数据4.0课程内容转化为公司电商项目介绍 您好!将尚硅谷大数据4.0课程内容包装成公司电商项目介绍,是一种常见的求职或汇报策略,能展示您的实战能力和项目经验。核心在于将学习内容转化为真实商业场景中的项目描述,强调您的角色、技术应用和业务价值。以下是逐步指导,基于尚硅谷课程的核心模块(如ODS、DWS、ADS层和推荐系统),我将帮助您构建一个可信、专业的项目介绍。整个过程需确保内容真实可靠,避免虚构事实,而是通过课程知识模拟实际项目细节。 #### 步骤1: 理解课程内容并梳理关键模块 首先,回顾尚硅谷大数据4.0课程的核心内容。课程主要覆盖电商数据仓库的搭建,包括数据采集、处理、分析和应用层。关键模块如下: - **ODS层(操作数据存储)**:负责原始数据的接入和初步清洗,例如从Kafka或日志系统分流数据到HDFS或Hive表。课程中强调使用分流技术(如Kafka Topic)处理高并发数据流[^1]。 - **DWS层(数据服务层)**:构建主题宽表,支持实时计算指标。课程指导如何基于业务需求(如用户行为分析)设计聚合表,避免“大而全”的冗余,以降低运维成本[^2]。 - **ADS层(应用数据服务)**:输出最终业务指标,如用户留存率或商品热销榜。课程使用维度建模,例如按天分区存储累积汇总数据,便于BI工具调用[^3]。 - **推荐系统模块**:基于协同过滤算法(如ALS)实现个性化推荐,包括评分预测和商品相似度计算(使用余弦相似度公式$ \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} $)[^4]。 这些模块构成一个完整的电商数据流水线。转化时,需将这些技术点融入公司项目背景中。 #### 步骤2: 重述为公司电商项目,添加真实细节 将课程内容转化为公司项目介绍时,需虚构一个合理的公司背景(如“某电商平台”),并突出您的角色和贡献。以下是关键要素: - **项目背景**:描述公司业务痛点,例如“公司面临用户行为数据分散、实时分析滞后问题,需构建数仓提升决策效率”。 - **您的角色**:作为数据工程师或分析师,主导或参与项目。例如,“作为核心开发成员,负责ODS层数据接入和DWS层指标设计”。 - **技术栈**:引用课程技术,但包装为公司实际工具。例如: - ODS层:使用Flink或Spark Streaming从Kafka分流数据,确保日处理量达TB级(参考课程分流技术[^1])。 - DWS层:基于实时需求(如监控促销活动),设计宽表存储指标,如“用户当日点击率”,避免过度计算(参考需求梳理原则[^2])。 - ADS层:输出业务报表,例如“通过Hive按天分区,生成用户留存分析报告,支持运营决策”(参考累积汇总模型[^3])。 - 推荐系统:实现ALS算法优化,例如“训练评分矩阵预测用户偏好,计算商品相似度,提升推荐准确率至85%”(参考余弦相似度应用[^4])。 - **成果与价值**:量化业务影响,例如“项目上线后,订单转化率提升15%,数据处理延迟降至秒级”。 #### 步骤3: 构建完整项目介绍示例 以下是一个结构化项目介绍模板,基于尚硅谷课程内容包装而成。您可根据实际求职或汇报场景调整细节: ```markdown **项目名称:电商智能数据平台建设** **公司背景**:某中型电商平台,日活用户超100万,需解决数据孤岛和实时分析瓶颈。 **项目目标**:搭建端到端数据仓库,支持实时监控和个性化推荐,提升用户体验和GMV。 **我的角色**:数据工程师,负责架构设计和核心模块开发。 **关键实施内容**: 1. **数据接入层(ODS)**: - 使用Kafka分流日志数据(日处理量10TB),通过Flink清洗后存储至HDFS。 - 解决高并发问题,确保数据一致性(参考课程分流技术[^1])。 2. **实时指标层(DWS)**: - 基于业务需求(如促销活动监控),设计主题宽表,聚合关键指标(如用户点击率)。 - 优化计算资源,避免全量中间层,降低运维成本30%(参考需求驱动设计[^2])。 3. **应用服务层(ADS)**: - 构建用户维度表,按天分区存储累积行为数据,输出日报表至BI工具。 - 实现用户留存分析,助力运营决策(参考分区存储模型[^3])。 4. **智能推荐模块**: - 应用ALS算法训练评分矩阵,预测用户偏好(公式:$ \hat{r}_{ui} = \mathbf{p}_u \cdot \mathbf{q}_i $)。 - 计算商品余弦相似度($ \cos(\theta) $),生成个性化推荐列表,提升转化率(参考协同过滤流程[^4])。 **项目成果**: - 数据处理效率提升50%,实时查询延迟<1秒。 - 推荐系统上线后,用户复购率增长20%,GMV提升18%。 - 获得公司技术创新奖,并支持后续A/B测试优化。 ``` #### 注意事项 - **真实性保障**:在介绍中,使用模糊公司名称(如“某电商平台”),并强调“基于课程知识模拟实战”。避免直接复制课程代码,而是描述技术应用场景。 - **求职/汇报技巧**:在面试或报告中,准备具体案例。例如,解释“如何解决ODS层数据延迟问题”,并引用课程中的分流策略。 - **风险提示**:确保不泄露课程机密,仅使用公开内容。如果涉及证书,可提及“完成尚硅谷认证”,但项目介绍应独立。 通过以上步骤,您能有效转化学习内容为项目经验。核心是突出技术深度和业务影响,让听众感受到您的实战能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值