封装HttpUrlConnection开箱即用
因为经常用到 便写出来方边使用 直接复制本类即可
import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; /** * 封装HttpURLConnection开箱即用 * Create by yster@foxmail.com 2018/9/10/010 19:17 */ public class HttpUtil { private HttpURLConnection connection; private Charset charset = Charset.forName("UTF-8"); private int readTimeout = 32000; private int connectTimeout = 10000; private String method = "GET"; private boolean doInput = true; private Map<String, String> headers = null; private String data = null; /** * 实例化对象 */ public static HttpUtil connect(String url) throws IOException { return new HttpUtil((HttpURLConnection) new URL(url).openConnection()); } /** * 禁止new实例 */ private HttpUtil() { } private HttpUtil(HttpURLConnection connection) { this.connection = connection; } /** * 设置读去超时时间/ms * * @param timeout */ public HttpUtil setReadTimeout(int timeout) { this.readTimeout = timeout; return this; } /** * 设置链接超时时间/ms * * @param timeout */ public HttpUtil setConnectTimeout(int timeout) { this.connectTimeout = timeout; return this; } /** * 设置请求方式 * * @param method */ public HttpUtil setMethod(String method) { this.method = method; return this; } /** * 添加Headers * * @param map */ public HttpUtil setHeaders(Map<String, String> map) { String cookie = "Cookie"; if (map.containsKey(cookie)) { headers = new HashMap<>(); headers.put(cookie, map.get(cookie)); } return this; } /** * 是否接受输入流 * 默认true * * @param is */ public HttpUtil setDoInput(boolean is) { this.doInput = is; return this; } /** * 设置请求响应的编码 */ public HttpUtil setCharset(String charset) { this.charset = Charset.forName(charset); return this; } /** * 写入数据,接受Map<String,String>或String类型<br> * 例如POST时的参数<br> * demo=1&name=2 */ public HttpUtil setData(Object object) { if (object == null) { return this; } else if (object instanceof String) { this.data = (String) object; } else if (object instanceof Map) { Map map = (Map) object; StringBuilder builder = new StringBuilder(); for (Object key : map.keySet()) { builder.append(key + "=" + map.get(key) + "&"); } this.data = builder.toString().substring(0, builder.length() > 0 ? builder.length() - 1 : builder.length()); } return this; } /** * 发起请求 */ public HttpUtil execute() throws IOException { //添加请求头 if (headers != null) { for (String key : headers.keySet()) { connection.setRequestProperty(key, headers.get(key)); } } //设置读去超时时间为10秒 connection.setReadTimeout(readTimeout); //设置链接超时为10秒 connection.setConnectTimeout(connectTimeout); //设置请求方式,GET,POST connection.setRequestMethod(method.toUpperCase()); //接受输入流 connection.setDoInput(doInput); //写入参数 if (data != null && !method.equalsIgnoreCase("GET")) { //启动输出流,当需要传递参数时需要开启 connection.setDoOutput(true); //添加请求参数,注意:如果是GET请求,参数要写在URL中 OutputStream output = connection.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, charset)); //写入参数 用&分割。 writer.write(data); writer.flush(); writer.close(); } //发起请求 connection.connect(); return this; } /** * 获取HttpURLConnection */ public HttpURLConnection getConnection() { return this.connection; } /** * 获取响应字符串 */ public String getBody(String... charsets) { //设置编码 String charset = "UTF-8"; if (charsets.length > 0) { charset = charsets[0]; } //读取输入流 try { InputStream inputStream = connection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, charset)); String line = bufferedReader.readLine(); StringBuilder builder = new StringBuilder(); while (line != null) { builder.append(line); line = bufferedReader.readLine(); } return builder.toString(); } catch (IOException e) { e.printStackTrace(); } //失败返回NULL return null; } public static void main(String[] args) throws IOException { String body = HttpUtil.connect("http://www.baidu.com") .setMethod("GET") .setCharset("UTF-8") .execute() .getBody(); System.out.println(body); } }
封装HttpUrlConnection开箱即用的更多相关文章
- 封装HttpURLConnection
package com.pingyijinren.test; import java.io.BufferedReader; import java.io.InputStream; import jav ...
- J1001.Java原生桌面及Web开发浅谈
自从Java问世以来,在服务端开发方面取得了巨大的发展.但是在桌面/Web开发方面,一直没有得到大的发展.从最初的AWT,到Swing,再到JavaFX,Java从来没有在桌面/Web解决方案中取得重 ...
- Android:Volley源代码解析
简单实例 Volley是一个封装HttpUrlConnection和HttpClient的网络通信框架,集AsyncHttpClient和Universal-Image-Loader的长处于了一身.既 ...
- $《第一行代码:Android》读书笔记——第10章 Android网络编程
(一)WebView的用法 1.WebView也是一个普通的控件. 2.常用用法: WebView webView = (WebView)findViewById(R.id.web_view); we ...
- Volley框架源代码分析
Volley框架分析Github链接 Volley框架分析 Volley源代码解析 为了学习Volley的网络框架,我在AS中将Volley代码又一次撸了一遍,感觉这样的照抄代码也是一种挺好的学习方式 ...
- Gong服务实现平滑重启分析
平滑重启是指能让我们的程序在重启的过程不中断服务,新老进程无缝衔接,实现零停机时间(Zero-Downtime)部署: 平滑重启是建立在优雅退出的基础之上的,之前一篇文章介绍了相关实现:Golang中 ...
- Spring Cloud 系列之 Netflix Zuul 服务网关
什么是 Zuul Zuul 是从设备和网站到应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul 旨在实现动态路由,监视,弹性和安全性.Zuul 包含了对请求的路由和过滤两个最主要的功能. Z ...
- Spring Cloud 系列之 Gateway 服务网关(一)
什么是 Spring Cloud Gateway Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由 ...
- Vue+EasyPOI导出Excel(带图片)
一.前言 平时的工作中,Excel 导入导出功能是非常常见的功能,无论是前端 Vue (js-xlsx) 还是 后端 Java (POI),如果让大家手动编码实现的话,恐怕就很麻烦了,尤其是一些定制化 ...
随机推荐
- Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器
一.开发环境 Nginx地址: http://nginx.org/download/nginx-1.14.2.tar.gz Nginx-rtmp-module地址: https://github.c ...
- C#-循环语句(六)
for循环 格式: for(表达式1;循环条件;表达式2) { 循环体; } 解释:先执行表达式1,再判断循环条件是否为真,如果为真则执行循环体,执行完成后再执行表达式2 再次判断循环条件,由此一直反 ...
- python第一百三十天 ---简单的BBS论坛
简单的BBS论坛 实现功能 git仓库地址:https://github.com/uge3/BBS 1.整体参考“抽屉新热榜” + “博客园” 2.实现不同论坛版块 3.帖子列表展示 4.个人博客主页 ...
- python第一百一十八天---ajax--图片验证码 + Session
原生AJAX Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件). 1.Xm ...
- 特别篇:Hyper-v群集模拟实战演示
介绍 由于前面几张的都是直接整理了下 九叔的hyper-v电子书发上来的,个人觉得他写的不是最详细,因此今天我按照自己的实际情况来写个模拟的实战演示.所有的东西都通过VMware WorkStatio ...
- es6的正则扩展笔记之修饰符
es6对于正则表达式添加了 u 修饰符和 y 修饰符. u 修饰符:含义为“Unicode模式”,用来正确处理大于\uFFFF的Unicode字符. 该修饰符不光会正确处理正则表达式,还会正确处 ...
- Welcom to Swift
1.第一个程序 import Foundation println(“hello world”) 2.常用数据类型 int/UInt/Double/Float/Bool/String/Array/Di ...
- C++ 中operator用法:隐式类型转换
[转]C++ operator两种用法 C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator c ...
- update layer tree导致页面卡顿
前因 今天检查一个vue页面问题,就是在切换Tab时候(某些win10电脑),页面会卡顿一段很长的时间,短则3秒,长则十几秒,这个体验非常糟糕,于是我着手寻找其中原因. 概况 这个vue页面的元素非常 ...
- 怎样用命令行开启或关闭Windows服务
怎样用命令行开启或关闭Windows服务 本篇博客主要包含一个内容: 怎样用命令行开启或关闭Windows服务 闲话少叙,直奔主题. 1.在桌面右击新建一个文本文档,然后打开. 2.找到需要开启或关闭 ...