1. 程式人生 > >Java學習--HttpURLConnection傳送post請求

Java學習--HttpURLConnection傳送post請求

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by Fairy on 2017/12/27.
 */
public class WebPost {
    private static BufferedReader reader;
    private static StringBuffer response;

    public static void doWebPost(String httpMethodStr, String parameterData,String token) throws Exception{
        try {
            URL url = new URL(httpMethodStr);//建立連線
            URLConnection urlConnection = url.openConnection();//宣告一個抽象類URLConnection的引用urlConnection
            // 此處的urlConnection物件實際上是根據URL的請求協議(此處是http)生成的URLConnection類的子類HttpURLConnection,故此處最好將其轉化為
            // HttpURLConnection型別的物件,以便用到HttpURLConnection更多的API.如下:
            HttpURLConnection connection = (HttpURLConnection) urlConnection; //宣告一個抽象類HttpURLConnection的引用connection
            //URLConnection和HttpURLConnection使用的都是java.net中的類,屬於標準的java介面。
            //HttpURLConnection繼承自URLConnection,差別在與HttpURLConnection僅僅針對Http連線。
            connection.setRequestMethod("POST");//設定請求方式為"POST",預設為"GET"
            connection.setDoOutput(true);//設定是否向HttpUrlConnction輸出,因為這個是POST請求,引數要放在http正文內,因此需要設為true,預設情況下是false
            connection.setDoInput(true);//設定是否向HttpUrlConnection讀入,預設情況下是true
            connection.setUseCaches(false);//POST請求不能使用快取(POST不能被快取)
            connection.setInstanceFollowRedirects(true);//設定只作用於當前的例項
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            connection.setRequestProperty("Cookie", "SSID=" + token);
            connection.connect();//connect()函式會根據HttpURLConnection物件的配置值 生成http頭部資訊,因此在呼叫connect函式之前,就必須把所有的配置準備好
            //HttpURLConnection是基於HTTP協議的,其底層通過socket通訊實現。如果不設定超時(timeout),在網路異常的情況下,可能會導致程式僵死而不繼續往下執行。
            connection.setConnectTimeout(20*1000);//設定連線主機超時(單位:毫秒)
            connection.setReadTimeout(20*1000);//設定從主機讀取資料超時(單位:毫秒)

            //正文的內容是通過outputStream流寫入的,實際上outputStream不是一個網路流,充其量是個字串流,往裡面寫入的東西不會立即傳送到網路,
            //而是存在於記憶體緩衝區中,待outputStream流關閉時,根據輸入的內容生成http正文。至此,http請求的東西已經全部準備就緒
            DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());
            byte[] t = parameterData.getBytes("utf-8");
            dataOutputStream.write(t);
            dataOutputStream.flush();
            dataOutputStream.close();

            //對outputStream的寫操作,又必須要在inputStream的讀操作之前
            InputStream inputStream = connection.getInputStream();// <===注意,實際傳送請求的程式碼段就在這裡

            //讀取響應
            reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            String lines;
            response = new StringBuffer("");
            while ((lines = reader.readLine()) != null) {
                response.append(lines);
                response.append("\r\n");
            }
        }catch (MalformedURLException e){
            e.printStackTrace();
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public static String returnResult(){
        return response.toString();
    }
}