import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; /** * 提供通过HTTP协议获取内容的方法 <br/> * 所有提供方法中的params参数在内部不会进行自动的url encode,如果提交参数需要进行url encode,请调用方自行处理 * @Description: HTTP请求代理工具 * @author lushuifa * @date 2016年11月18日 上午11:21:05 */ public class HttpUtil { /** * logger */ private static Logger logger = Logger.getLogger(HttpUtil.class); /** * 支持的Http method * */ private static enum HttpMethod { POST,DELETE,GET,PUT,HEAD; }; @SuppressWarnings({ "unchecked", "rawtypes" }) private static String invokeUrl(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String encoding, HttpMethod method){ //构造请求参数字符串 StringBuilder paramsStr = null; if(params != null){ paramsStr = new StringBuilder(); Set<Map.Entry> entries = params.entrySet(); for(Map.Entry entry:entries){ String value = (entry.getValue()!=null)?(String.valueOf(entry.getValue())):""; paramsStr.append(entry.getKey() + "=" + value + "&"); } //只有POST方法才能通过OutputStream(即form的形式)提交参数 if(method != HttpMethod.POST){ url += "?"+paramsStr.toString(); } } URL uUrl = null; HttpURLConnection conn = null; BufferedWriter out = null; BufferedReader in = null; try { //创建和初始化连接 uUrl = new URL(url); conn = (HttpURLConnection) uUrl.openConnection(); conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); conn.setRequestMethod(method.toString()); conn.setDoOutput(true); conn.setDoInput(true); //设置连接超时时间 conn.setConnectTimeout(connectTimeout); //设置读取超时时间 conn.setReadTimeout(readTimeout); //指定请求header参数 if(headers != null && headers.size() > 0){ Set<String> headerSet = headers.keySet(); for(String key:headerSet){ conn.setRequestProperty(key, headers.get(key)); } } if(paramsStr != null && method == HttpMethod.POST){ //发送请求参数 out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),encoding)); out.write(paramsStr.toString()); out.flush(); } //接收返回结果 StringBuilder result = new StringBuilder(); in = new BufferedReader(new InputStreamReader(conn.getInputStream(),encoding)); if(in != null){ String line = ""; while ((line = in.readLine()) != null) { result.append(line); } } return result.toString(); } catch (Exception e) { logger.error("调用接口["+url+"]失败!请求URL:"+url+",参数:"+params,e); //处理错误流,提高http连接被重用的几率 try { byte[] buf = new byte[100]; InputStream es = conn.getErrorStream(); if(es != null){ while (es.read(buf) > 0) {;} es.close(); } } catch (Exception e1) { e1.printStackTrace(); } } finally { try { if (out!=null) { out.close(); } }catch (Exception e) { e.printStackTrace(); } try { if (in !=null) { in.close(); } }catch (Exception e) { e.printStackTrace(); } //关闭连接 if (conn != null){ conn.disconnect(); } } return null; } /** * POST方法提交Http请求,语义为“增加” <br/> * 注意:Http方法中只有POST方法才能使用body来提交内容 * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String post(String url, Map params, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.POST); } /** * POST方法提交Http请求,语义为“增加” <br/> * 注意:Http方法中只有POST方法才能使用body来提交内容 * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param headers 请求头参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String post(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.POST); } /** * GET方法提交Http请求,语义为“查询” * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String get(String url, Map params, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.GET); } /** * GET方法提交Http请求,语义为“查询” * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param headers 请求头参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String get(String url, Map params, Map<String,String> headers,int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.GET); } /** * PUT方法提交Http请求,语义为“更改” <br/> * 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String put(String url, Map params, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.PUT); } /** * PUT方法提交Http请求,语义为“更改” <br/> * 注意:PUT方法也是使用url提交参数内容而非body,所以参数最大长度收到服务器端实现的限制,Resin大概是8K * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param headers 请求头参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String put(String url, Map params, Map<String,String> headers,int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.PUT); } /** * DELETE方法提交Http请求,语义为“删除” * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String delete(String url, Map params, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.DELETE); } /** * DELETE方法提交Http请求,语义为“删除” * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param headers 请求头参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String delete(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.DELETE); } /** * HEAD方法提交Http请求,语义同GET方法 <br/> * 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽 * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String head(String url, Map params, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,null,connectTimeout,readTimeout,charset,HttpMethod.HEAD); } /** * HEAD方法提交Http请求,语义同GET方法 <br/> * 跟GET方法不同的是,用该方法请求,服务端不返回message body只返回头信息,能节省带宽 * @param url 资源路径(如果url中已经包含参数,则params应该为null) * @param params 参数 * @param headers 请求头参数 * @param connectTimeout 连接超时时间(单位为ms) * @param readTimeout 读取超时时间(单位为ms) * @param charset 字符集(一般该为“utf-8”) * @return */ public static String head(String url, Map params, Map<String,String> headers, int connectTimeout, int readTimeout, String charset){ return invokeUrl(url,params,headers,connectTimeout,readTimeout,charset,HttpMethod.HEAD); } public static void main(String[] args) { //Map params = new HashMap(); //params.put("phoneNo", "中文"); //String str = HttpUtil.get("http://localhost:9092/elis_smp_als_dmz/do/app/activitySupport/demo", params, 3000, 3000, "UTF-8"); //System.out.println(str); } }
相关推荐
Java原生的Http客户端是Java标准库中提供的一种基础网络通信工具,主要通过HttpURLConnection类进行网络请求。HttpNet网络请求框架就是基于这个类构建的一个轻量级、高效的网络请求库。在Java开发中,...
本篇将详细解析"网络请求工具类"所涵盖的知识点,包括原生的HttpClient、HttpUrlConnection、Xutils以及Volley框架的网络请求。 1. **原生的HttpClient** Android原生支持的HttpClient库是Apache HttpClient,它...
这个"java IP地址工具类"是为了解决这个问题而设计的。它提供了便捷的方法来获取和处理IP地址,尤其对于获取客户端IP地址在Web应用中至关重要。 首先,让我们详细了解一下`IpUtils`这个工具类。在Java中,获取IP...
通过上述技术和工具的组合,一个基于Java原生开发的通讯录管理系统能够实现高效、稳定的数据管理,同时提供直观的用户交互界面。对于初学者来说,这样的项目有助于理解和实践Java和数据库开发的基本原理;对于有经验...
该工具类是使用建造者模式开发的Java Http请求工具类,使用非常简单灵活。包含GET,POST,PUT,DELETE四种方式的请求,并且支持代理设置和文件上传等功能。使用方式请查看...
这个类通常会是一个权限请求的工具类或者抽象基类,它负责处理权限请求的逻辑。在这个类中,可能会包含以下方法: 1. `requestPermissions(String[] permissions, int requestCode)`: 这是启动权限请求的入口,传入...
在Java编程领域,工具类代码是开发者为了提高代码复用性、简化常见任务而编写的通用函数集合。这些工具类通常包含各种实用方法,适用于多种场景。本篇将重点介绍"Java自写的工具类代码"中涉及的关键知识点,包括前后...
以下将详细介绍Java文件上传的基本原理、原生代码的实现、工具类的封装以及如何在项目中应用。 1. **文件上传基本原理**: 文件上传通常涉及到HTTP协议中的POST请求,通过表单提交或者使用API接口。在服务器端,...
在本项目中,我们主要探讨的是如何使用Java原生的方式编写一个爬虫程序来抓取知乎网站上的文章信息。在不依赖任何第三方库如Jsoup的情况下,我们将利用Java的网络和字符串处理功能,特别是正则表达式来实现数据的...
本项目“Java+MySQL+JSP+Java原生手写实现分页”正是一个专注于展示如何使用Java后端、MySQL数据库、JSP(Java Server Pages)以及AJAX(异步JavaScript和XML)技术来实现这一功能的实例。以下是这个项目所涉及的...
微信APP支付工具类是Java开发中用于实现微信支付功能的核心组件。在移动应用开发中,尤其是在电商、服务类应用中,微信支付作为一种便捷的在线支付方式,被广泛采用。本工具类集成了与微信支付服务器交互的关键逻辑...
【标题】:“一个模仿Twitter的Java Web项目(基于原生的Servlet)” 这个项目是一个实践性的Java Web应用程序,旨在模仿知名社交媒体平台Twitter的功能。通过使用原生的Servlet技术,开发者可以深入理解Web应用的...
3. **HTTP通信**: Java的`java.net`包包含`HttpURLConnection`和`URL`类,这些可以用来发送HTTP请求到服务器获取网页内容。浏览器的主要功能之一就是加载和显示网页,这需要与Web服务器进行交互,获取HTML、CSS和...
java原生实现封装http请求工具类,方便网络请求,支持post,get请求
Java开发工具类是Java程序员日常工作中不可或缺的一部分,它们提供了丰富的功能,帮助开发者高效地完成各种任务。本资源“java常用开发工具类大全,涵盖常见工作的问题”是一个集合,旨在解决Java开发过程中的常见...
如果项目中使用了`gdhttp_oracle_0819`这个文件,可能意味着它是数据库连接相关的,可能是用来存储数据库配置信息或用于与Oracle数据库交互的工具类。在Android中直接操作数据库通常不是最佳实践,因为这可能会导致...
异步请求工具类通常用于网络数据的获取,避免阻塞主线程,保证UI的流畅。常见的实现有AsyncTask、Handler、RxJava或Volley等。这些工具类会创建后台线程执行网络请求,完成后再回调到主线程更新UI。 3. **数据库...
4. **网络编程**:`java.net`包提供了网络通信的接口和类,如`Socket`、`ServerSocket`用于TCP连接,`URL`和`URLConnection`用于HTTP请求。 5. **I/O与NIO**:Java API提供了传统的I/O流,如`InputStream`和`...
基于安卓原生和springboot后台的图书管理系统 ...用到的jar包有volley(网络请求),Gson(解析json),glide(网络图片展示),GsonFormat工具生成json对应的实体类 ,使用fragment+viewPage实现页面的切换
Java浏览器是一种基于Java技术实现的网络浏览工具,它利用Java平台的强大功能,提供了一种不同于传统Web浏览器的体验。在Java编程环境中,开发者可以利用Java的跨平台特性,创建一个能够在任何支持Java运行环境的...