Java學習筆記———《http的get請求和post請求及封裝的工具類》

最近學習了一下http的get請求和post請求的寫法,整理如下,並封裝了工具類,如有錯誤和不足之處歡迎各位批評糾正,互相學習!


package mj.http.utils;

/**
 * Created by MJ on 15/9/25.
 *
 * @use 該HttpParam類用於封裝HTTP請求參數
 */
public class HttpParam {

  private String key; // 請求參數
  private String value; // 參數值

  public HttpParam() {}

  public HttpParam(String key, String value) {
    this.key = key;
    this.value = value;
  }

  public String getKey() {
    return key;
  }

  public void setKey(String key) {
    this.key = key;
  }

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }
}


package mj.http.utils;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

/**
 * Created by MJ on 15/9/25.
 */
public class HttpParamOperation {

  private HttpParamOperation() {}

  private static Logger logger = Logger.getLogger(HttpParamOperation.class.getName());

  /**
   * Created by MJ on 15/9/25.
   *
   * @use 將map轉換成url參數格式: name1=value1&name2=value2
   *
   * @param map 參數map
   * @return String 返回參數格式: name1=value1&name2=value2
   */
  public static String getUrlParamsFromMap(Map<String, String> map) throws Exception {
    try {
      if (null != map) {
        StringBuilder stringBuilder = new StringBuilder();
        for (Map.Entry<String, String> entry : map.entrySet()) {
          stringBuilder.append(URLEncoder.encode(entry.getKey(), "UTF-8")).append("=")
              .append(URLEncoder.encode(entry.getValue(), "UTF-8")).append("&");
        }
        String content = stringBuilder.toString();
        if (content.endsWith("&")) {
          content = StringUtils.substringBeforeLast(content, "&");
        }
        return content;
      }
    } catch (Exception e) {
      logger.error(e);
    }
    return null;
  }

  /**
   * Created by MJ on 15/9/25.
   *
   * @use 將HttpParam列表轉換成url參數格式: name1=value1&name2=value2
   *
   * @param httpParamList HttpParam列表
   * @return String 返回參數格式: name1=value1&name2=value2
   */
  public static String getUrlParamsFromList(List<HttpParam> httpParamList) throws Exception {
    try {
      if (null != httpParamList) {
        StringBuilder stringBuilder = new StringBuilder();
        if (httpParamList.size() > 0) {
          for (HttpParam httpParam : httpParamList) {
            stringBuilder.append(URLEncoder.encode(httpParam.getKey(), "UTF-8")).append("=")
                .append(URLEncoder.encode(httpParam.getValue(), "UTF-8")).append("&");
          }
          String content = stringBuilder.toString();
          if (content.endsWith("&")) {
            content = StringUtils.substringBeforeLast(content, "&");
          }
          return content;
        }
      }
    } catch (Exception e) {
      logger.error(e);
    }
    return null;
  }
}


package mj.http.utils;

import org.apache.log4j.Logger;

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

/**
 * Created by MJ on 15/9/25.
 */

public class HttpRequestUtils {

  private HttpRequestUtils() {}

  private static Logger logger = Logger.getLogger(HttpRequestUtils.class.getName());

  /**
   * 向指定URL發送GET方法的請求
   *
   * @param url 發送請求的URL
   * @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。
   * @return URL 所代表遠程資源的響應結果
   */
  public static String sendGetRequest(String url, String param) throws Exception {
    StringBuilder stringBuilder = new StringBuilder(); // 用來接受返回值
    BufferedReader bufferedReader = null;
    try {
        if (null != url && null != param) {
            String getUrlStr = url + "?" + param;
            URL getUrl = new URL(getUrlStr);
            // 根據拼湊的URL,打開連接,URL.openConnection函數會根據URL的類型,返回不同的URLConnection子類的對象,這裏返回的是HttpURLConnection
            HttpURLConnection httpURLConnection = (HttpURLConnection) getUrl.openConnection();
            httpURLConnection.setRequestProperty(" Content-Type ", " application/x-www-form-urlencoded ");
            // 建立實際的連接,但是實際上get請求要在下一句的getInputStream()函數中才會真正發到服務器
            httpURLConnection.connect();
            // 定義 BufferedReader輸入流來讀取URL的響應
            bufferedReader =
                    new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "utf-8")); // 設置編碼,否則中文亂碼
            String line;
            while (null != (line = bufferedReader.readLine())) {
                stringBuilder.append(line);
            }
            httpURLConnection.disconnect(); // 斷開連接
            return stringBuilder.toString();
        }
    } catch (Exception e) {
      System.out.println("發送GET請求出現異常!" + e);
      logger.error(e);
    } finally { // 使用finally塊來關閉輸入流
      try {
        if (null != bufferedReader) {
          bufferedReader.close();
        }
      } catch (Exception e2) {
        logger.error(e2);
      }
    }
      return null;
  }

  /**
   * 向指定 URL 發送POST方法的請求
   *
   * @param url 發送請求的 URL
   * @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。
   * @return 所代表遠程資源的響應結果
   */
  public static String sendPostRequest(String url, String param) throws Exception {
    DataOutputStream dataOutputStream = null;
    BufferedReader bufferedReader = null;
    StringBuilder stringBuilder = new StringBuilder(); // 用來接受返回值
    try {
        if (null != url && null != param) {
            URL postUrl = new URL(url);
            // 打開和URL之間的連接
            HttpURLConnection httpURLConnection = (HttpURLConnection) postUrl.openConnection();
            // 設置通用的請求屬性
            httpURLConnection.setRequestMethod("POST"); // 設置post方法,默認是get方法
            httpURLConnection.setUseCaches(false); // post請求不能使用緩存
            // 配置本次連接的Content-type,配置爲application/x-www-form-urlencoded的意思是正文是urlencoded編碼過的form參數,下面我們可以看到我們對正文內容使用URLEncoder.encode進行編碼
            httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 發送POST請求必須設置如下兩行
            httpURLConnection.setDoOutput(true); // 設置是否向connection輸出,因爲這個是post請求,參數要放在http正文內,因此需要設爲true
            httpURLConnection.setDoInput(true); // 從connection讀入,默認是true
            // 連接,從openConnection()至此的配置必須要在connect之前完成,要注意的是getOutputStream會隱含的進行connect。
            // 建立實際的連接
            httpURLConnection.connect();
            // 獲取URLConnection對象對應的輸出流
            dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
            // 發送請求參數,writeBytes將字符串中的16位的unicode字符以8位的字符形式寫道流裏面
            dataOutputStream.writeBytes(param);
            //  刷新對象輸出流,將任何字節都寫入潛在的流中
            dataOutputStream.flush();
            // 定義BufferedReader輸入流來讀取URL的響應
            bufferedReader =
                    new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "utf-8")); // 設置編碼,否則中文亂碼
            String line;
            while (null != (line = bufferedReader.readLine())) {
                stringBuilder.append(line);
            }
            httpURLConnection.disconnect(); // 斷開連接
            return stringBuilder.toString();
        }
    } catch (Exception e) {
      System.out.println("發送 POST 請求出現異常!" + e);
      logger.error(e);
    } finally { // 使用finally塊來關閉輸出流、輸入流
      try {
        if (null != dataOutputStream) {
          dataOutputStream.close();
        }
        if (null != bufferedReader) {
          bufferedReader.close();
        }
      } catch (Exception e2) {
        logger.error(e2);
      }
    }
    return null;
  }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章