Http Get 请求,Java 请求工具类封装

JSON 2017-06-09 13:55:11 14645

之前提供Demo项目中有用到这个工具类,应同学要求,把这个工具类公布一下。直接上代码了。

支持不复杂的对象返回,也支持返回String。

请求方式:

//url
String url = String.format(aqurl, city,System.currentTimeMillis());
//请求返回Map
Map<String,Object> aqis = new Get().executeMethod(Map.class);


工具类源码

package com.sojson.common.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;

import org.apache.commons.io.IOUtils;

import com.google.gson.Gson;
import com.sojson.www.x.manager.HttpManager;
import com.sojson.www.x.utils.SslUtils;
/**
 *
 * 开发公司:SOJSON在线工具 <p>
 * 版权所有:© www.sojson.com<p>
 * 博客地址:https://www.sojson.com/blog/  <p>
 * <p>
 *
 * 封装返回JSON | String
 *
 * <p>
 *
 * 区分 责任人 日期    说明<br/>
 * 创建 周柏成 2017年6月9日 13:35  <br/>
 *
 * @author zhou-baicheng
 * @email  so@sojson.com
 * @version 1.0,2017年3月2日 02:35 <br/>
 *
 */
public class Get {
	
	private String url;
	//默认编码为utf-8
	private String charset = "UTF-8";
	//超时
	private int timeout = 3000;
	//请求头信息
	private Map<String,String> headers = new LinkedHashMap<String, String>();
	
	
	public Get(String url) {
		this.url = url;
	}
	
	/**
	 * 执行方法
	 * @param <T>
	 * @param requiredType	返回类型
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T>T executeMethod(Class<T> requiredType) {
		if(null == requiredType){
			LoggerUtils.fmtError(getClass(), "必须给定返回值类型。");
			return null;
		}
		URL xurl = null;
		InputStream input = null;
		InputStream stream = null;
		HttpURLConnection conn = null;
		BufferedReader in = null;
		try {
				xurl = new URL(url);
				if("https".equalsIgnoreCase(xurl.getProtocol())){
				   SslUtils.ignoreSsl();
				}
				// 打开和URL之间的连接  
				conn = (HttpURLConnection) xurl.openConnection(); 
				// 发送POST请求必须设置如下两行  
				conn.setRequestMethod("GET");// 提交模式
				conn.setDoInput(true);
				conn.setDoOutput(false);
				conn.setUseCaches(false);
				conn.setRequestProperty("Connection", "close"); 
				conn.setConnectTimeout(timeout);  //设置连接主机超时(单位:毫秒)  
				conn.setReadTimeout(timeout);     //设置从主机读取数据超时(单位:毫秒)  
				
				//请求头信息输入,包括cookie什么的
				for(Map.Entry<String, String> head : headers.entrySet()) {
					conn.addRequestProperty(head.getKey(), head.getValue());
				}
				input = conn.getInputStream();
				//获取相应头
				Map<String, List<String>> headers = conn.getHeaderFields();
				//判断请求头信息是否压缩
				for (Map.Entry<String, List<String>> head : headers.entrySet()) {
		    		if(null != head.getValue() && head.getValue().size() > 0){
		    			if("Content-Encoding".equalsIgnoreCase(head.getKey())){
		    				//GZIP 解压缩
							if(null != head.getValue() && head.getValue().size() > 0 && "gzip".equalsIgnoreCase(StringUtils.trim(head.getValue().get(0)))){
								input = new GZIPInputStream(input);  
							}
		    			}
					}
				}
				String result = "";
				//先采用 IOUtils 转换,如果错误,再用普通的方式转换
				try{
		    		result = IOUtils.toString(input,charset);
		    	}catch (Exception e) {
		    		StringBuffer sb = new StringBuffer("");  
		    		in = new BufferedReader(new InputStreamReader(input, charset));  
				    String line = "";  
				    while ((line = in.readLine()) != null){  
				    	sb.append(line);  
				    }  
				    result = sb.toString();
				}
		    	//如果返回String,直接返回即可
				if("java.lang.String".equals(requiredType.getCanonicalName())){
					return (T)result;
				}
				//其他对象,直接Gson转换
				return new Gson().fromJson(result,requiredType);
		} catch (Exception e) {
			LoggerUtils.fmtError(HttpManager.class, e, "请求失败,url[%s]", url);
			return  null;
		} finally {
			if(null !=conn)conn.disconnect();
			xurl = null;
			try {
				if(null != in)in.close();
				in = null;
			} catch (Exception e2) {
				LoggerUtils.fmtError(HttpManager.class, e2, "请求完毕关闭流出现异常,可以忽略![%s]", xurl);
			}
			try {
				if(null != input)input.close();
				input = null;
			} catch (Exception e2) {
				LoggerUtils.fmtError(HttpManager.class, e2, "请求完毕关闭流出现异常,可以忽略![%s]", xurl);
			}
			try {
				if(null != stream)stream.close();
				stream = null;
			} catch (Exception e2) {
				LoggerUtils.fmtError(HttpManager.class, e2, "请求完毕关闭流出现异常,可以忽略![%s]", xurl);
			}
		}
		
	}
	public String getCharset() {
		return charset;
	}
	public Get setCharset(String charset) {
		this.charset = charset;
		return this;
	}


	public Map<String, String> getHeaders() {
		return headers;
	}

	/**
	 * 批量设置请求头信息
	 * @param headers
	 * @return
	 */
	public Get setHeaders(Map<String, String> headers) {
		this.headers = headers;
		return this;
	}
	//单个设置请求头信息
	public Get setHeader(String key,String value){
		this.headers.put(key, value);
		return this;
	}
	
}

其他说明

工具类SslUtils 在这里:https://www.sojson.com/blog/195.html ,作用是忽略  HTTPS  无证书的情况。

其他一个LoggerUtils ,是日志输出,这个可以不用管,就是一个日志输出,要源码的话,群里有!

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/236.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Java 实现在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
Springboot HTTP请求,Springboot HTTP 请求 Demo。Get/Post
在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具【更新说明】
Springboot HTTP Get/Post 请求讲解,Springboot几行代码完成Http请求
Java 发送Email,Java 邮件发送工具封装
对Log4j 日志工具封装java LoggerUtils查看和下载
JavaHTTP请求乱码解决,GZIP 返回值乱码解决
Java Cookie 操作工具
Java模拟WSS websocket ssl请求Java WSS模拟请求代码示例
HTTP模拟请求有几种方法
最新文章
文件上传漏洞与防御 4058
前端构建工具选型指南:Webpack、Vite、Rollup、esbuild 深度对比 1444
物联网时代2026年时序数据库选型指南 1151
SaaS行业面临AI挑战:从“无限复用”到“灵活适应” 1269
神经网络:从构造到模型训练全链路解析 1168
一文吃透 Redis 核心存储结构:ziplist、listpack 与哈希表扩容 / 并发查询 1593
Linux sudo提权完整指南:从基础用法到生产级安全配置 691
XSS 和 CSRF 的本质区别及开发防御全解析 772
JVM垃圾回收(GC)全维度解析:从原理到调优实战 813
Linux动静态库与ELF加载全解析:从实操制作到底层原理 912
最热文章
免费天气API,天气JSON API,不限次数获取十五天的天气预报 783114
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 711464
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 679993
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 562673
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 512621
Elasticsearch教程(四) elasticsearch head 插件安装和使用 484794
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 302947
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 247433
Elasticsearch教程(一),全程直播(小白级别) 233097
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 228329
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...