通过java.net.URLConnection发送HTTP请求的方法

来源:互联网 发布:淘宝客服对话技巧 编辑:程序博客网 时间:2024/04/29 08:07

转载路径为:http://www.cnblogs.com/nick-huang/p/3859353.html

如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求。
Java有原生的API可用于发送HTTP请求,即java.net.URL、java.net.URLConnection,这些API很好用、很常用,但不够简便;

所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient。
目前项目主要用到Java原生的方式,所以,这里主要介绍此方式。

运用原生Java Api发送简单的Get请求、Post请求
HTTP请求粗分为两种,一种是GET请求,一种是POST请求。(详细的请见:Hypertext Transfer Protocol – HTTP/1.1 - Method Definitions)

使用Java发送这两种请求的代码大同小异,只是一些参数设置的不同。步骤如下:

1 通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection2 设置请求的参数3 发送请求4 以输入流的形式获取返回内容5 关闭输入流

简单的Get请求示例如下:

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;public class HttpGetRequest {    /**     * Main     * @param args     * @throws Exception      */    public static void main(String[] args) throws Exception {        System.out.println(doGet());    }    /**     * Get Request     * @return     * @throws Exception     */    public static String doGet() throws Exception {        URL localURL = new URL("http://localhost:8080/OneHttpServer/");        URLConnection connection = localURL.openConnection();        HttpURLConnection httpURLConnection = (HttpURLConnection)connection;        httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");        InputStream inputStream = null;        InputStreamReader inputStreamReader = null;        BufferedReader reader = null;        StringBuffer resultBuffer = new StringBuffer();        String tempLine = null;        if (httpURLConnection.getResponseCode() >= 300) {            throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());        }        try {            inputStream = httpURLConnection.getInputStream();            inputStreamReader = new InputStreamReader(inputStream);            reader = new BufferedReader(inputStreamReader);            while ((tempLine = reader.readLine()) != null) {                resultBuffer.append(tempLine);            }        } finally {            if (reader != null) {                reader.close();            }            if (inputStreamReader != null) {                inputStreamReader.close();            }            if (inputStream != null) {                inputStream.close();            }        }        return resultBuffer.toString();    }}

简单的Post请求示例如下:

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;public class HttpPostRequest {    /**     * Main     * @param args     * @throws Exception      */    public static void main(String[] args) throws Exception {        System.out.println(doPost());    }    /**     * Post Request     * @return     * @throws Exception     */    public static String doPost() throws Exception {        String parameterData = "username=nickhuang&blog=http://www.cnblogs.com/nick-huang/";        URL localURL = new URL("http://localhost:8080/OneHttpServer/");        URLConnection connection = localURL.openConnection();        HttpURLConnection httpURLConnection = (HttpURLConnection)connection;        httpURLConnection.setDoOutput(true);        httpURLConnection.setRequestMethod("POST");        httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");        httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterData.length()));        OutputStream outputStream = null;        OutputStreamWriter outputStreamWriter = null;        InputStream inputStream = null;        InputStreamReader inputStreamReader = null;        BufferedReader reader = null;        StringBuffer resultBuffer = new StringBuffer();        String tempLine = null;        try {            outputStream = httpURLConnection.getOutputStream();            outputStreamWriter = new OutputStreamWriter(outputStream);            outputStreamWriter.write(parameterData.toString());            outputStreamWriter.flush();            if (httpURLConnection.getResponseCode() >= 300) {                throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());            }            inputStream = httpURLConnection.getInputStream();            inputStreamReader = new InputStreamReader(inputStream);            reader = new BufferedReader(inputStreamReader);            while ((tempLine = reader.readLine()) != null) {                resultBuffer.append(tempLine);            }        } finally {            if (outputStreamWriter != null) {                outputStreamWriter.close();            }            if (outputStream != null) {                outputStream.close();            }            if (reader != null) {                reader.close();            }            if (inputStreamReader != null) {                inputStreamReader.close();            }            if (inputStream != null) {                inputStream.close();            }        }        return resultBuffer.toString();    }}

简单封装
如果项目中有多处地方使用HTTP请求,我们适当对其进行封装,

可以大大减少代码量(不需每次都写一大段原生的请求Source code)
也可以使配置更灵活、方便(全局设置一些项目特有的配置,比如已商榷的time out时间、已确定的Proxy Server,避免以后改动繁琐)

以下简单封装成HttpRequestor,以便使用:

package com.nicchagil.util.httprequestor;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.InetSocketAddress;import java.net.Proxy;import java.net.URL;import java.net.URLConnection;import java.util.Iterator;import java.util.Map;public class HttpRequestor {    private String charset = "utf-8";    private Integer connectTimeout = null;    private Integer socketTimeout = null;    private String proxyHost = null;    private Integer proxyPort = null;    /**     * Do GET request     * @param url     * @return     * @throws Exception     * @throws IOException     */    public String doGet(String url) throws Exception {        URL localURL = new URL(url);        URLConnection connection = openConnection(localURL);        HttpURLConnection httpURLConnection = (HttpURLConnection)connection;        httpURLConnection.setRequestProperty("Accept-Charset", charset);        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");        InputStream inputStream = null;        InputStreamReader inputStreamReader = null;        BufferedReader reader = null;        StringBuffer resultBuffer = new StringBuffer();        String tempLine = null;        if (httpURLConnection.getResponseCode() >= 300) {            throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());        }        try {            inputStream = httpURLConnection.getInputStream();            inputStreamReader = new InputStreamReader(inputStream);            reader = new BufferedReader(inputStreamReader);            while ((tempLine = reader.readLine()) != null) {                resultBuffer.append(tempLine);            }        } finally {            if (reader != null) {                reader.close();            }            if (inputStreamReader != null) {                inputStreamReader.close();            }            if (inputStream != null) {                inputStream.close();            }        }        return resultBuffer.toString();    }    /**     * Do POST request     * @param url     * @param parameterMap     * @return     * @throws Exception      */    public String doPost(String url, Map parameterMap) throws Exception {        /* Translate parameter map to parameter date string */        StringBuffer parameterBuffer = new StringBuffer();        if (parameterMap != null) {            Iterator iterator = parameterMap.keySet().iterator();            String key = null;            String value = null;            while (iterator.hasNext()) {                key = (String)iterator.next();                if (parameterMap.get(key) != null) {                    value = (String)parameterMap.get(key);                } else {                    value = "";                }                parameterBuffer.append(key).append("=").append(value);                if (iterator.hasNext()) {                    parameterBuffer.append("&");                }            }        }        System.out.println("POST parameter : " + parameterBuffer.toString());        URL localURL = new URL(url);        URLConnection connection = openConnection(localURL);        HttpURLConnection httpURLConnection = (HttpURLConnection)connection;        httpURLConnection.setDoOutput(true);        httpURLConnection.setRequestMethod("POST");        httpURLConnection.setRequestProperty("Accept-Charset", charset);        httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");        httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterBuffer.length()));        OutputStream outputStream = null;        OutputStreamWriter outputStreamWriter = null;        InputStream inputStream = null;        InputStreamReader inputStreamReader = null;        BufferedReader reader = null;        StringBuffer resultBuffer = new StringBuffer();        String tempLine = null;        try {            outputStream = httpURLConnection.getOutputStream();            outputStreamWriter = new OutputStreamWriter(outputStream);            outputStreamWriter.write(parameterBuffer.toString());            outputStreamWriter.flush();            if (httpURLConnection.getResponseCode() >= 300) {                throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());            }            inputStream = httpURLConnection.getInputStream();            inputStreamReader = new InputStreamReader(inputStream);            reader = new BufferedReader(inputStreamReader);            while ((tempLine = reader.readLine()) != null) {                resultBuffer.append(tempLine);            }        } finally {            if (outputStreamWriter != null) {                outputStreamWriter.close();            }            if (outputStream != null) {                outputStream.close();            }            if (reader != null) {                reader.close();            }            if (inputStreamReader != null) {                inputStreamReader.close();            }            if (inputStream != null) {                inputStream.close();            }        }        return resultBuffer.toString();    }    private URLConnection openConnection(URL localURL) throws IOException {        URLConnection connection;        if (proxyHost != null && proxyPort != null) {            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));            connection = localURL.openConnection(proxy);        } else {            connection = localURL.openConnection();        }        return connection;    }    /**     * Render request according setting     * @param request     */    private void renderRequest(URLConnection connection) {        if (connectTimeout != null) {            connection.setConnectTimeout(connectTimeout);        }        if (socketTimeout != null) {            connection.setReadTimeout(socketTimeout);        }    }    /*     * Getter & Setter     */    public Integer getConnectTimeout() {        return connectTimeout;    }    public void setConnectTimeout(Integer connectTimeout) {        this.connectTimeout = connectTimeout;    }    public Integer getSocketTimeout() {        return socketTimeout;    }    public void setSocketTimeout(Integer socketTimeout) {        this.socketTimeout = socketTimeout;    }    public String getProxyHost() {        return proxyHost;    }    public void setProxyHost(String proxyHost) {        this.proxyHost = proxyHost;    }    public Integer getProxyPort() {        return proxyPort;    }    public void setProxyPort(Integer proxyPort) {        this.proxyPort = proxyPort;    }    public String getCharset() {        return charset;    }    public void setCharset(String charset) {        this.charset = charset;    }}HttpRequestor
0 0
原创粉丝点击