HTTP请求代理

来源:互联网 发布:国内 阿里云 aws 优势 编辑:程序博客网 时间:2024/05/29 16:02

工具类:

package com.coreCompanySupplier.receive.connector;import org.apache.commons.lang.StringUtils;import com.coreCompanySupplier.receive.connector.dto.GeneralHttpSend;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.InetSocketAddress;import java.net.MalformedURLException;import java.net.ProtocolException;import java.net.Proxy;import java.net.URL;import java.util.HashMap;import java.util.Map;/** * http发送 * <p/> */public class HttpSendUtil {    /**     * http发送     *     * @param general 请求参数对象     * @return 响应报文     * @throws IOException      * @throws Exception 异常     */     public static String send(GeneralHttpSend general) throws HttpProxyException, IOException {            HttpURLConnection conn = null;            InputStream inputStream = null;            OutputStream dataOutputStream = null;            ByteArrayOutputStream bos = null;            try {                URL url = new URL(general.getUrl());                String proxyHost = general.getProxyHost();                if (StringUtils.isNotEmpty(proxyHost)) {                    InetSocketAddress sa = new InetSocketAddress(proxyHost, Integer.valueOf(general.getProxyPort()));                    Proxy proxy = new Proxy(Proxy.Type.HTTP, sa);                    conn = (HttpURLConnection) url.openConnection(proxy);                } else {                    conn = (HttpURLConnection) url.openConnection();                }                String reqCharSet = general.getReqCharSet();                //初始化http链接                initConn(conn, general);                dataOutputStream = new DataOutputStream(conn.getOutputStream());                dataOutputStream.write(general.getRequestData().getBytes(reqCharSet));                dataOutputStream.flush();                if (HttpURLConnection.HTTP_OK != conn.getResponseCode()) {                    throw new HttpProxyException("Request fail, error message : " + conn.getResponseMessage() + ", http status : " + conn.getResponseCode());                } else {                    bos = new ByteArrayOutputStream();                    inputStream = conn.getInputStream();                    Transfer.copy(inputStream, bos, -1);                    bos.flush();                }            }finally {                try {                    Transfer.disconnect(inputStream, dataOutputStream, conn);                } finally {                    if (bos != null) bos.close();                }            }            return new String(bos.toByteArray(), general.getRespCharSet());        }    /**     * 初始化http连接对象     *     * @param conn    http连接对象     * @param general 请求参数对象     * @throws ProtocolException      * @throws Exception 异常     */    private static void initConn(HttpURLConnection conn, GeneralHttpSend general) throws ProtocolException {        conn.setRequestMethod(general.getSubmitType());        conn.setUseCaches(general.isUseCaches());        conn.setDoInput(general.isDoInput());        conn.setDoOutput(general.isDoOutput());        Map<String, String> propertyMap = general.getRequestPropertyMap();        for (Map.Entry<String, String> entry : propertyMap.entrySet()) {            conn.setRequestProperty(entry.getKey(), entry.getValue());        }        //连接超时时间        conn.setConnectTimeout(Integer.parseInt(general.getConnectTimeOut()));        //读超时时间        conn.setReadTimeout(Integer.parseInt(general.getReadTimeOut()));    }}

GeneralHttpSend :

/** * 通用http发送器dto * <p/> * Created by 13071600 on 2017/5/26. */public class GeneralHttpSend extends GeneralHttp {    /**     * serialVersionUID     */    private static final long serialVersionUID = 1L;}

GeneralHttp:

public abstract class GeneralHttp extends GeneralSend {    /**     * serialVersionUID     */    private static final long serialVersionUID = 1L;    /**     * 请求url     */    private String url;    /**     * http提交方式,暂时只支持post提交     */    private String submitType = "POST";    /**     * 请求是否使用缓存,默认不使用,如有需要,自行设值     */    private boolean useCaches = false;    /**     * 设置是否从httpUrlConnection读入,默认true,如有需要,自行设值     */    private boolean doInput = true;    /**     * 设置是否向httpUrlConnection输出,默认true,如有需要,自行设值     */    private boolean doOutput = true;    /**     * 设定传输属性     */    private Map<String, String> requestPropertyMap;    public String getUrl() {        return url;    }    public void setUrl(String url) {        this.url = url;    }    public String getSubmitType() {        return submitType;    }    public void setSubmitType(String submitType) {        this.submitType = submitType;    }    public boolean isUseCaches() {        return useCaches;    }    public void setUseCaches(boolean useCaches) {        this.useCaches = useCaches;    }    public boolean isDoInput() {        return doInput;    }    public void setDoInput(boolean doInput) {        this.doInput = doInput;    }    public boolean isDoOutput() {        return doOutput;    }    public void setDoOutput(boolean doOutput) {        this.doOutput = doOutput;    }    public Map<String, String> getRequestPropertyMap() {        return requestPropertyMap;    }    public void setRequestPropertyMap(Map<String, String> requestPropertyMap) {        this.requestPropertyMap = requestPropertyMap;    }    @Override    public String toString() {        return "GeneralHttp{" +                "url='" + url + '\'' +                ", submitType='" + submitType + '\'' +                ", useCaches=" + useCaches +                ", doInput=" + doInput +                ", doOutput=" + doOutput +                ", requestPropertyMap=" + requestPropertyMap +                '}';    }}

GeneralSend:

public abstract class GeneralSend implements Serializable {    /**     * serialVersionUID     */    private static final long serialVersionUID = 1L;    /**     * 请求报文     */    private String requestData;    /**     * 连接超时,默认2s,请自行设置时间     *///    private String connectTimeOut = "2000";    private String connectTimeOut = "5000";    /**     * 读超时,默认5s,请自行设置时间     *///    private String readTimeOut = "5000";    private String readTimeOut = "10000";    /**     * 请求报文处理编码,默认UTF-8,如有特殊,自行设置     */    private String reqCharSet = "UTF-8";    /**     * 响应报文处理编码,默认UTF-8,如有特殊,自行设置     */    private String respCharSet = "UTF-8";    /**     * 代理地址     */    private String proxyHost;    /**     * 代理端口     */    private String proxyPort;    public String getRequestData() {        return requestData;    }    public void setRequestData(String requestData) {        this.requestData = requestData;    }    public String getConnectTimeOut() {        return connectTimeOut;    }    public void setConnectTimeOut(String connectTimeOut) {        this.connectTimeOut = connectTimeOut;    }    public String getReadTimeOut() {        return readTimeOut;    }    public void setReadTimeOut(String readTimeOut) {        this.readTimeOut = readTimeOut;    }    public String getReqCharSet() {        return reqCharSet;    }    public void setReqCharSet(String reqCharSet) {        this.reqCharSet = reqCharSet;    }    public String getRespCharSet() {        return respCharSet;    }    public void setRespCharSet(String respCharSet) {        this.respCharSet = respCharSet;    }    public String getProxyHost() {        return proxyHost;    }    public void setProxyHost(String proxyHost) {        this.proxyHost = proxyHost;    }    public String getProxyPort() {        return proxyPort;    }    public void setProxyPort(String proxyPort) {        this.proxyPort = proxyPort;    }    @Override    public String toString() {        return "GeneralSend{" +                "requestData='" + requestData + '\'' +                ", connectTimeOut='" + connectTimeOut + '\'' +                ", readTimeOut='" + readTimeOut + '\'' +                ", reqCharSet='" + reqCharSet + '\'' +                ", respCharSet='" + respCharSet + '\'' +                ", proxyHost='" + proxyHost + '\'' +                ", proxyPort='" + proxyPort + '\'' +                '}';    }}

Transfer:

package com.coreCompanySupplier.receive.connector;import java.io.*;import java.net.HttpURLConnection;import java.net.Socket;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;/** * 数据传输工具类 * * @author Guozheng * @version 1.0.0 12-08-28 11:34 */public final class Transfer {    /**     * 缓冲流缓存大小     */    public static final int DEFAULT_BUFFER_SIZE = 1024 * 64;    /**     * 每次读写操作的字节数     */    public static final int DEFAULT_BLOCK_SIZE = 1024 * 8;    /**     * 从输入流读出数据并写入输出流。     *     * @param is     输入流     * @param os     输出流     * @param length 复制的字节长度     * @throws java.io.IOException 传输中可能出现的异常     */    public static void copy(InputStream is, OutputStream os, long length) throws IOException {        if (length == 0) return;        // 指定长度是否有效        final boolean LENGTH_VALID = length > 0;        // 定义缓存        byte[] bytes = new byte[LENGTH_VALID && length < DEFAULT_BLOCK_SIZE ? (int) length : DEFAULT_BLOCK_SIZE];        // 已读取字节总数        long sum = 0;        // 当次读取字节数        int cnt;        // 复制        while ((cnt = read(is, bytes)) > 0) {            os.write(bytes, 0, cnt);            // 累计            sum += cnt;            // 指定有效长度            if (LENGTH_VALID) {                long unread = length - sum;     // 未读字节数                if (unread == 0) {   // 刚好读完                    break;                } else if (unread < DEFAULT_BLOCK_SIZE) {                    bytes = new byte[(int) unread];                }            }        }        // 校验已读数据长度和指定长度是否一致        if (LENGTH_VALID)            if (sum != length) throw new IOException("incorrect length: expected " + length + ", actual " + sum);    }    /**     * 从输入流中读出数据并全部写到输出流中     *     * @param is 输入流     * @param os 输出流     * @throws IOException 传输中出现的IO异常     */    public static void copy(InputStream is, OutputStream os) throws IOException {        copy(is, os, -1);    }    /**     * 从输入流中读取文件     *     * @param is     输入流     * @param target 目标文件     * @param length 文件长度     * @throws java.io.IOException 复制过程中出现的异常     */    public static void copy(InputStream is, File target, long length) throws IOException {        // 创建目标文件所在目录        File parent = target.getParentFile();        if (!parent.mkdirs() && !parent.exists())            throw new IOException("can not make directory: " + parent.getAbsolutePath());        // 复制        OutputStream os = null;        try {            os = new BufferedOutputStream(new FileOutputStream(target), DEFAULT_BUFFER_SIZE);            copy(is, os, length);            os.flush();        } finally {            if (os != null) os.close();        }    }    /**     * 读取文件到输出流     *     * @param source 源文件     * @param os     输出流     * @throws java.io.IOException 复制过程中出现的异常     */    public static void copy(File source, OutputStream os) throws IOException {        InputStream is = null;        try {            is = new BufferedInputStream(new FileInputStream(source), DEFAULT_BUFFER_SIZE);            copy(is, os, source.length());        } finally {            if (is != null) is.close();        }    }    /**     * 复制文件     *     * @param source 源文件     * @param target 目标文件     * @throws java.io.IOException 复制过程中出现的异常     */    public static void copy(File source, File target) throws IOException {        InputStream is = null;        try {            is = new BufferedInputStream(new FileInputStream(source), DEFAULT_BUFFER_SIZE);            copy(is, target, source.length());        } finally {            if (is != null) is.close();        }    }    /**     * 复制文件     *     * @param bytes  源数据     * @param target 目标文件     * @throws java.io.IOException 复制过程中出现的异常     */    public static void copy(byte[] bytes, File target) throws IOException {        InputStream is = null;        try {            is = new ByteArrayInputStream(bytes);            copy(is, target, bytes.length);        } finally {            if (is != null) is.close();        }    }    /**     * 从输入流中读取指定长度的字节数。     *     * @param is    输入流     * @param bytes 读取字节容器     * @return 已读取字节数,可能小于bytes.length     * @throws java.io.IOException 读取中出现的异常     */    public static int read(InputStream is, byte[] bytes) throws IOException {        // 从流中已经读出的字节数        int sum = 0;        // 在数据未满前一直读取,避免原始方式由于数据量大导致漏读数据        while (sum < bytes.length) {            // 本次读取的数据            int cnt = is.read(bytes, sum, bytes.length - sum);            // 如果流已经读到尽头,即使数组未读满也终止            if (cnt == -1) break;            // 已读数据计数累计            sum += cnt;        }        return sum;    }    /**     * 将字节数组按指定的长度左对齐、不足补\u0000写入输出流     *     * @param bytes  待输出字节     * @param os     输出流     * @param length 指定本次输出的字节长度     * @throws java.io.IOException 输出中出现的异常     */    public static void write(byte[] bytes, OutputStream os, int length) throws IOException {        // 定长数组,存放数据        byte[] box = new byte[length];        System.arraycopy(bytes, 0, box, 0, bytes.length);        os.write(box);    }    /**     * 压缩     *     * @param bytes 待压缩字节数组     * @return 压缩后的字节数组     * @throws IOException 异常     */    public static byte[] compress(byte[] bytes) throws IOException {        // 特殊处理null情况        if (bytes == null) return null;        // 压缩        GZIPOutputStream gos = null;        try {            ByteArrayOutputStream bos = new ByteArrayOutputStream();            gos = new GZIPOutputStream(bos);            gos.write(bytes);            gos.finish();            gos.flush();            gos.close();            return bos.toByteArray();        } finally {            if (gos != null) gos.close();        }    }    /**     * 解压缩     *     * @param bytes 待解压缩字节数组     * @return 解压缩后的字节数组     * @throws IOException 异常     */    public static byte[] decompress(byte[] bytes) throws IOException {        // 特殊处理null情况        if (bytes == null) return null;        // 解压        GZIPInputStream gis = null;        ByteArrayOutputStream bos = null;        try {            ByteArrayInputStream bis = new ByteArrayInputStream(bytes);            gis = new GZIPInputStream(bis);            bos = new ByteArrayOutputStream();            copy(gis, bos);            bos.flush();            bos.close();            return bos.toByteArray();        } finally {            close(gis, bos);        }    }    /**     * 关闭输入输出流     *     * @param is 输入流     * @param os 输出流     * @throws IOException 异常     */    public static void close(InputStream is, OutputStream os) throws IOException {        try {            if (is != null) is.close();        } finally {            if (os != null) os.close();        }    }    /**     * 关闭socket对象及相关流对象     *     * @param is     输入流     * @param os     输出流     * @param socket 对象     * @throws IOException 异常     */    public static void close(InputStream is, OutputStream os, Socket socket) throws IOException {        try {            close(is, os);        } finally {            if (socket != null) socket.close();        }    }    public static void disconnect(InputStream is, OutputStream os, HttpURLConnection connection) throws IOException {        try {            close(is, os);        } finally {            if (connection != null) connection.disconnect();        }    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 左肾泥沙样结石怎么办 双肾泥沙样结石怎么办 温州市民卡丢了怎么办 上眼皮过敏肿了怎么办 上眼皮又痒又肿怎么办 上眼皮红肿痛是怎么办 上眼皮肿的厉害怎么办 眼皮肿了还痒痒怎么办 眼睛被手指戳到怎么办 打球眼睛撞肿了怎么办 打球时眼睛被戳怎么办 狗眼睛被打充血怎么办 一只眼睛磨的慌怎么办 5个月宝宝结膜炎怎么办 金毛眼屎多白色怎么办 金毛眼红有眼屎怎么办 狗狗眼睛上火了怎么办 狗上火了眼屎多怎么办 金毛走路扭腰怎么办 金毛流鼻涕微黄怎么办 狗狗下眼皮红了怎么办 金毛眼睛打肿了怎么办 金毛的眼睛红怎么办 眼睛干涩有红血丝怎么办 小孩子眼睛红有眼屎怎么办 狗狗的肉垫粗糙怎么办 狗狗眼睛变蓝色怎么办 脸被太阳晒伤了怎么办 皮肤晒伤红肿痒怎么办 3岁儿童频繁眨眼怎么办 狗狗的眼睛红肿怎么办 脸过敏发红怎么办不痒 上眼皮红肿痒是怎么办 眼睛痒了几天了怎么办 眼睛肿了还痒怎么办 孩子脸上有红血丝怎么办 脸上长了红血丝怎么办 指甲受创出血了怎么办 手指被挤压紫了怎么办 眼睛撞了有淤血怎么办 下眼底有小白点怎么办