`

基于JAVA原生HTTP请求工具类

阅读更多
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);
	}

}

 

0
1
分享到:
评论

相关推荐

    一个基于Java原生的Http客户端。HttpNet网络请求框架基于HttpUrlConnection.zip

    Java原生的Http客户端是Java标准库中提供的一种基础网络通信工具,主要通过HttpURLConnection类进行网络请求。HttpNet网络请求框架就是基于这个类构建的一个轻量级、高效的网络请求库。在Java开发中,...

    网络请求工具类

    本篇将详细解析"网络请求工具类"所涵盖的知识点,包括原生的HttpClient、HttpUrlConnection、Xutils以及Volley框架的网络请求。 1. **原生的HttpClient** Android原生支持的HttpClient库是Apache HttpClient,它...

    java IP地址工具类,java IP地址获取,java获取客户端IP地址

    这个"java IP地址工具类"是为了解决这个问题而设计的。它提供了便捷的方法来获取和处理IP地址,尤其对于获取客户端IP地址在Web应用中至关重要。 首先,让我们详细了解一下`IpUtils`这个工具类。在Java中,获取IP...

    基于Java原生开发的通讯录管理系统

    通过上述技术和工具的组合,一个基于Java原生开发的通讯录管理系统能够实现高效、稳定的数据管理,同时提供直观的用户交互界面。对于初学者来说,这样的项目有助于理解和实践Java和数据库开发的基本原理;对于有经验...

    HttpRequests.java

    该工具类是使用建造者模式开发的Java Http请求工具类,使用非常简单灵活。包含GET,POST,PUT,DELETE四种方式的请求,并且支持代理设置和文件上传等功能。使用方式请查看...

    基于原生的6.0权限请求分装

    这个类通常会是一个权限请求的工具类或者抽象基类,它负责处理权限请求的逻辑。在这个类中,可能会包含以下方法: 1. `requestPermissions(String[] permissions, int requestCode)`: 这是启动权限请求的入口,传入...

    Java自写的工具类代码

    在Java编程领域,工具类代码是开发者为了提高代码复用性、简化常见任务而编写的通用函数集合。这些工具类通常包含各种实用方法,适用于多种场景。本篇将重点介绍"Java自写的工具类代码"中涉及的关键知识点,包括前后...

    Java文件上传代码(有原生代码,还有封装后的工具类,每行都有注释,通俗易懂,小白学习必备,带有简易项目)

    以下将详细介绍Java文件上传的基本原理、原生代码的实现、工具类的封装以及如何在项目中应用。 1. **文件上传基本原理**: 文件上传通常涉及到HTTP协议中的POST请求,通过表单提交或者使用API接口。在服务器端,...

    java原生爬虫爬取知乎文章

    在本项目中,我们主要探讨的是如何使用Java原生的方式编写一个爬虫程序来抓取知乎网站上的文章信息。在不依赖任何第三方库如Jsoup的情况下,我们将利用Java的网络和字符串处理功能,特别是正则表达式来实现数据的...

    Java+MySQL+JSP+Java原生手写实现分页

    本项目“Java+MySQL+JSP+Java原生手写实现分页”正是一个专注于展示如何使用Java后端、MySQL数据库、JSP(Java Server Pages)以及AJAX(异步JavaScript和XML)技术来实现这一功能的实例。以下是这个项目所涉及的...

    微信APP支付工具类(java)

    微信APP支付工具类是Java开发中用于实现微信支付功能的核心组件。在移动应用开发中,尤其是在电商、服务类应用中,微信支付作为一种便捷的在线支付方式,被广泛采用。本工具类集成了与微信支付服务器交互的关键逻辑...

    一个模仿Twitter的Java Web项目(基于原生的Servlet).zip

    【标题】:“一个模仿Twitter的Java Web项目(基于原生的Servlet)” 这个项目是一个实践性的Java Web应用程序,旨在模仿知名社交媒体平台Twitter的功能。通过使用原生的Servlet技术,开发者可以深入理解Web应用的...

    基于java开发的网页浏览器

    3. **HTTP通信**: Java的`java.net`包包含`HttpURLConnection`和`URL`类,这些可以用来发送HTTP请求到服务器获取网页内容。浏览器的主要功能之一就是加载和显示网页,这需要与Web服务器进行交互,获取HTML、CSS和...

    HttpKit.java

    java原生实现封装http请求工具类,方便网络请求,支持post,get请求

    java常用开发工具类大全,涵盖常见工作的问题.rar

    Java开发工具类是Java程序员日常工作中不可或缺的一部分,它们提供了丰富的功能,帮助开发者高效地完成各种任务。本资源“java常用开发工具类大全,涵盖常见工作的问题”是一个集合,旨在解决Java开发过程中的常见...

    andriod通过http请求json数据项目例子

    如果项目中使用了`gdhttp_oracle_0819`这个文件,可能意味着它是数据库连接相关的,可能是用来存储数据库配置信息或用于与Oracle数据库交互的工具类。在Android中直接操作数据库通常不是最佳实践,因为这可能会导致...

    Android收藏的工具类

    异步请求工具类通常用于网络数据的获取,避免阻塞主线程,保证UI的流畅。常见的实现有AsyncTask、Handler、RxJava或Volley等。这些工具类会创建后台线程执行网络请求,完成后再回调到主线程更新UI。 3. **数据库...

    Java API原生文档

    4. **网络编程**:`java.net`包提供了网络通信的接口和类,如`Socket`、`ServerSocket`用于TCP连接,`URL`和`URLConnection`用于HTTP请求。 5. **I/O与NIO**:Java API提供了传统的I/O流,如`InputStream`和`...

    基于安卓原生(前端)和springboot后台的图书管理系统,采用JSON格式数据进行前后端交互

    基于安卓原生和springboot后台的图书管理系统 ...用到的jar包有volley(网络请求),Gson(解析json),glide(网络图片展示),GsonFormat工具生成json对应的实体类 ,使用fragment+viewPage实现页面的切换

    JAVA浏览器和源代码

    Java浏览器是一种基于Java技术实现的网络浏览工具,它利用Java平台的强大功能,提供了一种不同于传统Web浏览器的体验。在Java编程环境中,开发者可以利用Java的跨平台特性,创建一个能够在任何支持Java运行环境的...

Global site tag (gtag.js) - Google Analytics