热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

httpurlconnection使用详解,httpurlconnection关闭的方法

一)背景今天在项目中遇到一个HttpURLConnectionSystem.setProperty设置全局代理的坑。项目需求:公司需要开发一个企业微信单点登录的功能,会涉及到调用微

一)背景

今天在项目中遇到一个HttpURLConnection System.setProperty设置全局代理的坑。

项目需求:公司需要开发一个企业微信单点登录的功能,会涉及到调用微信的相关接口,如果微信认证OK,再调用公司内部另一个系统的接口,获取一些用户相关权限,微信和内部权限都获取到之后就跳转到系统首页进行其它操作。

 

项目流程:在微信中加一个菜单入口-->从微信点击菜单-->调用微信相关认证接口-->调用公司内部其它项目接口-->认证OK,跳转到公司系统首页界面。

 

坑的原因:由于项目部署在公司内网服务器,在访问微信接口的时候需要通过代理方式进行外网接口请求,而内部接口不需要代理就可以请求(代理请求会报错),因为第一步先通过微信访问,先访问的时候就通过System.setProperty设置了全局代理,在微信接口验证成功之后,再访问公司内部接口就一直返回null。

为啥说是坑:因为以前做过纯微信接口访问功能,所以就设置了全局代理,把这部分代码移动新项目中就没注意,微信访问单点登录这个功能点是现成的,所以在发生产包的时候,我在模拟公司内部接口的时候,访问一直是OK的,只要用户一通过微信进入,就一直报请求失败,我再重新模拟公司内部接口也会一直失败,但我把项目重新启动之后,又可以模拟成功。这就导致了一个循环,我不断修改代码然后打包,发布生产,模拟测试,用户微信测试,模拟测试再失败,这个问题真是弄了一天,发了无数次包。有个同事最后说了一句话提醒了我,说“我这项目是不是有缓存,或者设置了什么全局变量”,刚开始还没注意,但不断测试修改代码之后,慢慢就感觉是全局代理设置这个地方出问题了,找到问题之后,换了一种临时代理方式,修改好,再发布就可以OK了。

 

二)Http请求源码:

package com.oysept.http.utils;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.InetSocketAddress;import java.net.Proxy;import java.net.Proxy.Type;import java.net.URL;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.StringUtils;import com.alibaba.fastjson.JSONObject;/** * http请求工具类 * @author ouyangjun */public class HttpInvoker { private final static Logger LOGGER = LoggerFactory.getLogger(HttpInvoker.class); /** * HttpURLConnection * @param sUrl: 请求地址 * @param sMethod: 请求方式GET、POST * @param sOutput: 请求参数 * @param proxyHost: 代理地址 * @param proxyPort: 代理IP * @param contentType: 请求Content-type * @return */ public static JSONObject exec(String sUrl, String sMethod, String sOutput, String proxyHost, String proxyPort, String contentType) { JSONObject json = null; StringBuffer buffer = new StringBuffer(); HttpURLConnection con = null; try { URL url = new URL(sUrl); if (!StringUtils.isEmpty(proxyHost) && !StringUtils.isEmpty(proxyPort)) { // 如果是本机自己测试,不需要代理请求,但发到服务器上的时候需要代理请求 // 对http开启全局代理 //System.setProperty("http.proxyHost", proxyHost); //System.setProperty("http.proxyPort", proxyPort); // 对https开启全局代理 //System.setProperty("https.proxyHost", proxyHost); //System.setProperty("https.proxyPort", proxyPort); // 代理访问http请求 Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort))); con = (HttpURLConnection) url.openConnection(proxy); } else { // 原生访问http请求,未代理请求 con = (HttpURLConnection) url.openConnection(); } // json方式调用 if (!StringUtils.isEmpty(contentType) && "JSON".equals(contentType)) { con.setRequestProperty("Content-type", "application/json"); } con.setDoOutput(true); // 是否可以输出 con.setDoInput(true); // 是否可以输入 con.setUseCaches(false); // 是否可以使用缓存 con.setRequestMethod(sMethod); con.setConnectTimeout(60000); // 最高超时时间 con.setReadTimeout(60000); // 最高读取时间 con.setConnectTimeout(60000); // 最高连接时间 if (sOutput != null) { OutputStream os = con.getOutputStream(); try { os.write(sOutput.getBytes("UTF-8")); } catch (Exception e) { LOGGER.info("HttpInvoker exec error: {}", e); } finally { if (os != null) { try { os.close(); } catch (IOException e) { LOGGER.info("HttpInvoker exec error: {}", e); } } } } InputStream is = null; InputStreamReader inputReader = null; BufferedReader reader = null; try { is = con.getInputStream(); inputReader = new InputStreamReader(is, "UTF-8"); reader = new BufferedReader(inputReader); String temp; while ((temp = reader.readLine()) != null) { buffer.append(temp); } LOGGER.info("==>HttpInvoker exec buffer: {}", buffer==null||buffer.length()<=0?null:buffer.toString()); } catch (Exception e) { LOGGER.info("HttpInvoker exec error: {}", e); } finally { try { if (reader != null) { reader.close(); } if (inputReader != null) { inputReader.close(); } if (is != null) { is.close(); } } catch (IOException e) { LOGGER.info("HttpInvoker exec error: {}", e); } } // con.disconnect(); json = JSONObject.parseObject(buffer.toString()); if (json != null) { LOGGER.info("OK, http连接Url: {}, 返回数据,json: {}", sUrl, json); } else { LOGGER.info("return json is null, http连接Url: {}, 返回数据,json: {}", sUrl, json); } } catch (IOException e) { LOGGER.info("HttpInvoker exec error: {}", e); } finally { if (con != null) { con.disconnect(); } } return json; }}

HttpURLConnection请求格式:

HttpInvoker.exec(sUrl, "POST", sOutput, proxyHost, proxyPort, "JSON");

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!


推荐阅读
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
author-avatar
lodng
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有