java模拟http的get和post请求

如题,使用Java模拟GET和POST请求。使用GET可以实现网页抓取,使用POST可以实现 对某些网站登录的暴力破解。 不过仅是练习,实际意义不大。

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.io.Reader;

import java.net.HttpURLConnection;

import java.net.ProtocolException;

import java.net.URL;

import java.util.Map;



/**

 * HTTP工具

 * @author robinzhang

 *

 */

public class HttpUtil {

    /**

     * 请求类型: GET

     */

    public final static String GET = "GET";

    /**

     * 请求类型: POST

     */

    public final static String POST = "POST";

    

    /**

     * 模拟Http Get请求

     * @param urlStr

     *             请求路径

     * @param paramMap

     *             请求参数

     * @return

     * @throws Exception

     */

    public static String get(String urlStr, Map<String, String> paramMap) throws Exception{

        urlStr = urlStr + "?" + getParamString(paramMap);

        HttpURLConnection conn = null;

        try{

            //创建URL对象

            URL url = new URL(urlStr);

            //获取URL连接

            conn = (HttpURLConnection) url.openConnection();

            //设置通用的请求属性

            setHttpUrlConnection(conn, GET);

            //建立实际的连接

            conn.connect();

            //获取响应的内容

            return readResponseContent(conn.getInputStream());

        }finally{

            if(null!=conn) conn.disconnect();

        }

    }

    

    /**

     * 模拟Http Post请求

     * @param urlStr

     *             请求路径

     * @param paramMap

     *             请求参数

     * @return

     * @throws Exception 

     */

    public static String post(String urlStr, Map<String, String> paramMap) throws Exception{

        HttpURLConnection conn = null;

        PrintWriter writer = null;

        try{

            //创建URL对象

            URL url = new URL(urlStr);

            //获取请求参数

            String param = getParamString(paramMap);

            //获取URL连接

            conn = (HttpURLConnection) url.openConnection();

            //设置通用请求属性

            setHttpUrlConnection(conn, POST);

            //建立实际的连接

            conn.connect();

            //将请求参数写入请求字符流中

            writer = new PrintWriter(conn.getOutputStream());

            writer.print(param);

            writer.flush();

            //读取响应的内容

            return readResponseContent(conn.getInputStream());

        }finally{

            if(null!=conn) conn.disconnect();

            if(null!=writer) writer.close();

        }

    }

    

    /**

     * 读取响应字节流并将之转为字符串

     * @param in

     *         要读取的字节流

     * @return

     * @throws IOException

     */

    private static String readResponseContent(InputStream in) throws IOException{

        Reader reader = null;

        StringBuilder content = new StringBuilder();

        try{

            reader = new InputStreamReader(in);

            char[] buffer = new char[1024];

            int head = 0;

            while( (head=reader.read(buffer))>0 ){

                content.append(new String(buffer, 0, head));

            }

            return content.toString();

        }finally{

            if(null!=in) in.close();

            if(null!=reader) reader.close();

        }

    }

    

    /**

     * 设置Http连接属性 

     * @param conn

     *             http连接

     * @return

     * @throws ProtocolException 

     * @throws Exception 

     */

    private static void setHttpUrlConnection(HttpURLConnection conn, String requestMethod) throws ProtocolException{

        conn.setRequestMethod(requestMethod);

        conn.setRequestProperty("accept", "*/*");

        conn.setRequestProperty("Accept-Language", "zh-CN");

        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");

        conn.setRequestProperty("Proxy-Connection", "Keep-Alive");

        if(null!=requestMethod && POST.equals(requestMethod)){

            conn.setDoOutput(true);

            conn.setDoInput(true);

        }

    }

    

    /**

     * 将参数转为路径字符串

     * @param params

     *             参数

     * @return

     */

    private static String getParamString(Map<String, String> paramMap){

        if(null==paramMap || paramMap.isEmpty()){

            return "";

        }

        StringBuilder builder = new StringBuilder();

        for(String key : paramMap.keySet() ){

            builder.append("&")

                   .append(key).append("=").append(paramMap.get(key));

        }

        return builder.deleteCharAt(0).toString();

    }

    

    public static void main(String[] args){

        try {

            System.out.println( get("http://127.0.0.1/crazy_java.pdf", null) );

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

你可能感兴趣的:(java)