HttpURLConnUtil

简介: package com.css.common.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; impor

package com.css.common.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Locale;
import java.util.Random;


/**
 * 用于HTTP连接处理的工具类
 *
 * @version 1.0
 *
 */
public class HttpURLConnUtil {
 
 /**
  * 默认的HttpURLConnection访问连接次数
  */
 private static int DEFAULT_TRY_COUNT = 3;
 
 /**
  * 默认的StreamReader读写字符编码
  */
 private static String DEFAULT_READER_ENCODE = "UTF-8";
 
 /**
  * 默认的URLEncode字符编码
  */
 private static String DEFAULT_URL_ENCODE = "UTF-8";
 
 /**
  * 默认的指定特殊关键字
  */
 private static String KEYWORD = "json=";

 public static String[] UserAgent = new String[] {
   "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)",
   "Baiduspider",
   "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)",
   "Googlebot" };

 /**
  * 得到HTML源码
  * @param s_url 访问路径
  * @return HTML源码
  * @throws Exception
  */
 public static String getHTML(String s_url) throws Exception {
  return getHTML(s_url, DEFAULT_READER_ENCODE , DEFAULT_TRY_COUNT , KEYWORD , DEFAULT_URL_ENCODE);
 }

 /**
  * 得到HTML源码
  * @param s_url 访问路径
  * @param s_type 编码类型
  * @return HTML源码
  * @throws Exception
  */
 public static String getHTML(String s_url, String s_type) throws Exception {
  return getHTML(s_url,s_type,DEFAULT_TRY_COUNT,KEYWORD,DEFAULT_URL_ENCODE);
 }

 /**
  * 得到HTML源码
  * @param s_url 访问路径
  * @param try_count 访问连接次数
  * @return HTML源码
  * @throws Exception
  */
 public static String getHTML(String s_url, int try_count) throws Exception {
  return getHTML(s_url,DEFAULT_READER_ENCODE,try_count,KEYWORD,DEFAULT_URL_ENCODE);
 }
 
 
 /**
  * 得到HTML源码
  * @param s_url 访问路径
  * @param s_type 编码类型
  * @param try_count 访问连接次数
  * @param charStr 指定特殊关键字
  * @param enc 设置字符串中指定特殊字符之后的字符编码(默认UTF-8)
  * @return
  * @throws Exception
  */
 public static String getHTML(String s_url, String s_type, int try_count,String charStr,String enc) throws Exception {
  s_url = setUrlEncode(s_url,charStr,enc);
  return getHTML(s_url,s_type,try_count,Locale.getDefault().toString());
 }
 
 /**
  * 得到HTML源码
  * @param s_url 访问路径
  * @param charStr 指定特殊关键字
  * @param enc 设置字符串中指定特殊字符之后的字符编码
  * @return
  * @throws Exception
  */
 public static String getHTML(String s_url,String charStr,String enc) throws Exception {
  s_url = setUrlEncode(s_url,charStr,enc);
  return getHTML(s_url,DEFAULT_READER_ENCODE,DEFAULT_TRY_COUNT,Locale.getDefault().toString());
 }
 
 /**
  * 得到HTML源码
  * @param s_url  访问路径
  * @param language  指定的连接语言
  * @return
  * @throws Exception
  */
 public static String getHTMLL(String s_url,String language) throws Exception{
  s_url = setUrlEncode(s_url,KEYWORD,DEFAULT_URL_ENCODE);
  return getHTML(s_url,DEFAULT_READER_ENCODE,DEFAULT_TRY_COUNT,language);
 }
 
 /**
  * 得到HTML源码
  * @param s_url  访问路径
  * @param charStr  指定特殊关键字
  * @param enc   设置字符串中指定特殊字符之后的字符编码
  * @param language  指定的连接语言
  * @return
  * @throws Exception
  */
 public static String getHTMLL(String s_url,String charStr,String enc,String language) throws Exception{
  s_url = setUrlEncode(s_url,charStr,enc);
  return getHTML(s_url,DEFAULT_READER_ENCODE,DEFAULT_TRY_COUNT,language);
 }
 
 /**
  * 得到HTML源码
  * @param s_url 访问路径
  * @param s_type 编码类型
  * @param try_count 访问连接次数
  * @return
  * @throws Exception
  */
 public static String getHTML(String s_url, String s_type, int try_count,String language) throws Exception {
  HttpURLConnection url_con = null;
        String responseContent = null;
        try{
            StringBuffer params = new StringBuffer();
            String queryUrl = s_url;
            int paramIndex = s_url.indexOf("?");
            if (paramIndex > 0){
                queryUrl = s_url.substring(0, paramIndex);
                String parameters = s_url.substring(paramIndex + 1, s_url.length());
                String[] paramArray = parameters.split("&");
                for (int i = 0; i < paramArray.length; i++){
                    String string = paramArray[i];
                    int index = string.indexOf("=");
                    if (index > 0){
                        String parameter = string.substring(0, index);
                        String value = string.substring(index + 1, string.length());
                        params.append(parameter);
                        params.append("=");
                        params.append(value);
                        params.append("&");
                    }
                }
                params = params.deleteCharAt(params.length() - 1);
            }
            URL url = new URL(queryUrl);
            url_con = (HttpURLConnection) url.openConnection();
      Random r = new Random();
      url_con.setRequestMethod("POST");//POST方式提交
      url_con.setDoOutput(true);
      url_con.setDoInput(true);
      url_con.setRequestProperty("User-agent", UserAgent[r.nextInt(UserAgent.length)]);
      url_con.setRequestProperty("accept-language", language);
            byte[] b = params.toString().getBytes();
            url_con.getOutputStream().write(b, 0, b.length);
            url_con.getOutputStream().flush();
            url_con.getOutputStream().close();
            InputStream in = url_con.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(in,s_type));
            String tempLine = rd.readLine();
            StringBuffer temp = new StringBuffer();
            String crlf=System.getProperty("line.separator");
            while (tempLine != null){
                temp.append(tempLine);
                temp.append(crlf);
                tempLine = rd.readLine();
            }
            responseContent = temp.toString();
            rd.close();
            in.close();
        }catch (IOException e){
   if (try_count == 0){
    throw new Exception(e.getMessage() + ":" + s_url);
   } else {
    try_count--;
    System.out.println("连接失败,还可尝试" + try_count + "次连接...");
    return getHTML(s_url,s_type,try_count,language);
   }
        }finally{
            if (url_con != null){
                url_con.disconnect();
            }
        }
        return responseContent;
 }
 
 /**
  * 设置字符串中指定特殊字符之后的字符编码
  * @param s_url 原字符串
  * @param charstr 指定特殊字符
  * @param enc 指定字符编码格式
  * @return
  */
 public static String setUrlEncode(String s_url,String charstr,String enc) throws Exception {
  int i_json = s_url.indexOf(charstr);
  if(i_json>0){
   
   String s_url_1 = s_url.substring(0, i_json+charstr.length());
   //System.out.println("s_url_1 = "+s_url_1);
   
   String s_url_2 = URLEncoder.encode(s_url.substring(i_json+charstr.length()),enc);
   //System.out.println("s_url_2 = "+s_url_2);
   
   s_url = s_url_1 +s_url_2;
   //System.out.println("s_url = "+s_url);
  }
  return s_url;
 }

 /**
  * 替换文件中敏感字符
  * @param s 如:||,:,*,?,<>,|,]等
  * @return
  */
 public static String ReplaceFileName(String s) {

  s = s.replaceAll("[\\\\/:\\*\\?\"<>|]", " ");
  return s;
 }

 /**
  * 替换空格
  * @param s 字符串
  * @return
  */
 public static String ReplaceSpecial(String s) {

  for (int i = 0; i <= 8; i++)
   s = s.replaceAll("" + (char) i, " ");

  s = s.replaceAll("" + (char) 11, " ");
  s = s.replaceAll("" + (char) 12, " ");

  for (int i = 14; i <= 31; i++)
   s = s.replaceAll("" + (char) i, " ");
  return s;
 }

 public static void main(String[] args) throws Exception {

  String url = "http://localhost:8080/chinafung_sso/passport/list?json={memberName:'好副食店栽要'}";
  
  long start = System.currentTimeMillis();
 
  String html = getHTML(url);
  System.out.println(html);
  
  System.out.println(System.currentTimeMillis() - start + "ms");
 }

}

目录
相关文章
|
2月前
|
人工智能 语音技术 云计算
基于客户真实使用场景的云剪辑Timeline问题解答与代码实操
本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第6期,从客户真实实践场景出发,分享一些Timeline小技巧(AI_TTS、主轨道、素材对齐),助力客户降低开发时间与成本。
135529 86
基于客户真实使用场景的云剪辑Timeline问题解答与代码实操
|
1月前
|
存储 开发者 索引
python怎么判断变量的数据类型
python怎么判断变量的数据类型
29 0
|
5月前
|
XML Java 数据格式
Spring中使用AspectJ实现AOP的五种通知
Spring中使用AspectJ实现AOP的五种通知
71 1
Spring中使用AspectJ实现AOP的五种通知
|
11月前
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17588 8
|
5月前
|
Java 编译器
面试题之代码纠错
面试题之代码纠错
39 1
|
网络协议 安全 关系型数据库
Manage Customer Relations with SuiteCRM on Alibaba Cloud
By Jeff Cleverley, Alibaba Cloud Tech Share Author. Tech Share is Alibaba Cloud's incentive program to encourage the sharing of technical knowledge and best practices within the cloud community.
10044 3
Manage Customer Relations with SuiteCRM on Alibaba Cloud
|
4天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101783 0
|
4天前
|
SQL 关系型数据库 分布式数据库
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
|
12天前
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151033 4