`
thrillerzw
  • 浏览: 143923 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

httpclient使用

    博客分类:
  • java
 
阅读更多
/**
	 * 
	 * @Description: httpclient post请求 
	 * @author thrillerzw
	 */
	public static String httpclientPostRequest(String url, Map<String, String> paramsMap) throws HttpException, IOException {
		HttpClient client = new HttpClient();
		//使用POST方法
		PostMethod method = new PostMethod(url);

		//添加参数
		if (paramsMap != null) {
			Iterator<Map.Entry<String, String>> iterator = paramsMap.entrySet().iterator();
			while (iterator.hasNext()) {
				Map.Entry<String, String> entry = iterator.next();
				String key = entry.getKey();
				String value = entry.getValue();
				((PostMethod) method).addParameter(key, value);
			}
		}
		HttpMethodParams param = method.getParams();
		param.setContentCharset("UTF-8");
		client.executeMethod(method);
		int statusCode = method.getStatusCode();
		if (statusCode != 200) {
			return "";
		}
		InputStream stream = method.getResponseBodyAsStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
		StringBuffer buf = new StringBuffer();
		String line;
		while (null != (line = br.readLine())) {
			buf.append(line).append("\n");
		}
		//释放连接
		method.releaseConnection();
		// System.out.println(buf.toString());
		return buf.toString();
	}
	
	//url检测连接超时时间
	private static final int URL_CHECK_CONN_TIME=20000;
	//url检测读取超时时间
	private static final int URL_CHECK_SO_TIME=20000;
	/**
	 * 
	 * @Description: get方式判断是否正确url
	 * @author thrillerzw
	 */
	public static boolean isRightUrl(String url) {
		if (StringUtils.isEmpty(url)) {
			return false;
		}
		String urlLowercase=url.toLowerCase();
		if (!urlLowercase.startsWith("http") && !urlLowercase.startsWith("https")) {
			return false;
		}
		//白名单
		if (isWhiteList(url)) {
			return true;
		}
		//替换特殊字符
		url = buildUrl(url);

		int statusCode=0;
		statusCode = getUrlRespongseCode(url,URL_CHECK_CONN_TIME,URL_CHECK_SO_TIME);
		if (statusCode == 301) {
			String newUrl = get301NewUrl(url,URL_CHECK_CONN_TIME,URL_CHECK_SO_TIME);
			statusCode=getUrlRespongseCode(newUrl,URL_CHECK_CONN_TIME,URL_CHECK_SO_TIME);
		}
		if (statusCode == 200) {
			return true;
		}
		return false;
	}
	/**
	 * 
	 * @Description: get方式获取url响应码,如果异常,返回0
	 * @author thrillerzw
	 */
	public static GetMethod getGetMtethod(String url,int contimeout,int sotimeout){
		HttpClient httpClient = new HttpClient();
		httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(contimeout);
		httpClient.getHttpConnectionManager().getParams().setSoTimeout(sotimeout);
		GetMethod getMethod = null;
		try {
			getMethod = new GetMethod(url);
			//禁掉自动处理重定向
			getMethod.setFollowRedirects(false);
			httpClient.executeMethod(getMethod);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return getMethod;
	}

	/**
	 * 
	 * @Description: get方式获取url响应码,如果异常,返回0
	 * @author thrillerzw
	 */
	public static int getUrlRespongseCode(String url,int contimeout,int sotimeout){
		int statusCode = 0;
		GetMethod getMethod=null;
		try {
			getMethod=getGetMtethod(url,contimeout,sotimeout);
			statusCode=getMethod.getStatusCode();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//释放连接
			if(getMethod!=null){
				getMethod.releaseConnection();
			}
		}
		return statusCode;
	}
	
	
	/**
	 * 
	 * @Description: get方式获取301重定向到的地址url
	 *
	 * @author thrillerzw
	 */
	public static String get301NewUrl(String url,int contimeout,int sotimeout){
		
		GetMethod getMethod = null;
		String newUrl="";
		try {
			getMethod=getGetMtethod(url,contimeout,sotimeout);
			Header header = getMethod.getResponseHeader("Location");
			newUrl = header.getValue();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//释放连接
			if(getMethod!=null){
				getMethod.releaseConnection();
			}
		}
		return newUrl;
	}

	//替换url特殊字符
	private static String buildUrl(String url) {
		if (StringUtils.isEmpty(url)) {
			return "";
		}
		//替换url
		url = url.replaceAll(" ", "%20");
		StringBuffer urlSb = new StringBuffer();
		//处理中文转码
		for (int i = 0; i < url.length(); i++) {
			char ch = url.charAt(i);
			Character.UnicodeBlock ub = Character.UnicodeBlock.of(ch);
			if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
					|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A) {
				//目前已知的中文字符UTF-8集合
				try {
					String str = URLEncoder.encode(String.valueOf(ch), "utf-8");
					urlSb.append(str);
				} catch (UnsupportedEncodingException e) {
					urlSb.append(ch);
					e.printStackTrace();
				}
			} else {
				urlSb.append(ch);
			}
		}
		return urlSb.toString();
	}

	//url是否包含白名单域名
	private static boolean isWhiteList(String url) {
		String whitelist = Constants.URL_DOMAIN_WHITELIST;
		if (StringUtils.isEmpty(url) || StringUtils.isEmpty(whitelist)) {
			return false;
		}

		String[] whiteUrlDomainArr = whitelist.split(",");
		for (String whiteUrlDomain : whiteUrlDomainArr) {
			if (url.toLowerCase().contains(whiteUrlDomain.toLowerCase())) {
				return true;
			}
		}
		return false;
	}

	public static void main(String[] args) throws HttpException, IOException, URISyntaxException {
		String url="http://www.baidu.com";
		boolean res = isRightUrl(url);
		System.out.println("res="+res);
	}

 

0
0
分享到:
评论

相关推荐

    httpclient使用教程

    ### httpclient使用教程 #### HttpClient概述与重要性 在当今互联网时代,HTTP协议无疑是网络通信中最常用且至关重要的协议之一。随着技术的发展,越来越多的Java应用程序需要直接通过HTTP协议访问网络资源。尽管...

    HttpClient使用教程 事例

    在提供的压缩包文件中,"第一个版本.rar"和"第二个版本.rar"可能包含了不同的HttpClient使用示例或者不同版本的代码。你可以解压并查看这些文件,以便更深入地理解和学习HttpClient的具体用法。每个版本可能包含不同...

    httpclient使用详解共8页.pdf.zip

    《HttpClient使用详解》 HttpClient是Apache软件基金会的 HttpClient项目提供的一款强大的HTTP客户端工具,它允许开发者在Java应用程序中实现复杂的HTTP通信。这份8页的PDF文档深入解析了HttpClient的使用方法,...

    httpClient使用指南最新版

    ### HttpClient 使用指南知识点详解 ...以上是基于提供的部分内容对HttpClient使用指南的相关知识点进行了详细说明。通过这些知识点的学习,可以更好地理解和掌握HttpClient的工作原理及其在实际开发中的应用。

    httpclient使用post方法上传多个图片个其他参数的demo源码

    在本示例中,我们将关注“httpclient使用post方法上传多个图片和其他参数的demo源码”,这是一个涉及到文件上传和参数传递的重要场景。 在Web开发中,POST方法常用于向服务器提交数据,比如表单数据或文件。...

    HttpClient使用

    这篇博客文章《HttpClient使用》(链接:https://leesonhomme.iteye.com/blog/491095)可能涵盖了HttpClient的基本用法和一些实用技巧。由于没有具体的描述,我们将基于HttpClient的一般知识点进行详细介绍。 1. **...

    HTTPClient使用代理

    使用httpClient进行代理

    Httpclient使用jar包三合一,基本使用方法

    Http协议使用封装jar包(commons-codec-1.3.jar、commons-httpclient-3.1.jar、commons-logging-1.1.jar) 简单使用方法: public static void main(String[] args) { // String str1 = &quot;...;...

    httpclient使用帮助类

    httpclient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,本文档提供使用httpclient的使用方法

    HttpClient使用HttpGet进行json数据传输(所使用的jar.zip)

    1. **导入依赖**:在Java项目中使用HttpClient,你需要先将所需的jar文件添加到类路径中。描述中的"所使用的jar.zip"可能包含了HttpClient的库文件,如httpclient、httpcore等。确保导入了这些库,才能使用...

    HttpClient使用示例教程

    1. **创建HttpClient对象**:这是发送请求的基础,通常使用`HttpClient`类的实例。 2. **创建请求方法**:根据需求创建`HttpGet`或`HttpPost`对象,分别对应GET和POST请求。 3. **设置请求参数**:可以通过`set...

    httpclient.jar包下载

    2. **请求和响应模型**:HttpClient使用HttpRequest和HttpResponse对象封装HTTP请求和响应,便于处理请求头、请求体和响应头、响应体。 3. **身份验证和安全**:HttpClient支持多种身份验证机制,包括基本认证、...

    HttpClient使用小结

    在HttpClient的使用中,我们首先需要了解几个核心组件: 1. **HttpClient实例**:这是整个HTTP通信的基础,通过`HttpClientBuilder`创建,可以设置各种配置,如连接超时、重试策略等。 2. **HttpRequestBase**:这...

Global site tag (gtag.js) - Google Analytics