jdk-httpclient

jdk-httpclient

jdk自帶發送http請求的類,不需要第三方依賴

發送get請求和post請求

發送get請求

BufferedReader in = null;
StringBuffer strBuf = new StringBuffer();
try {
  URL realUrl = new URL(url);
  // 打開和URL之間的連接
  URLConnection conn = realUrl.openConnection();
  // 定義BufferedReader輸入流來讀取URL的響應
  InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream());
  in = new BufferedReader(inputStreamReader);
  String line;
  while ((line = in.readLine()) != null) {
    strBuf.append(line);
    strBuf.append("\r\n");
  }
} catch (IOException e) {
  e.printStackTrace();
} finally {
  if (in != null) {
    try {
      in.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

設置請求參數

conn.setRequestProperty("content-type", "application/json");

封裝一個簡單的get方法

public StringBuffer get(String url, Map<String, String> headers) {
  URLConnection conn = null;
  try {
    URL realUrl = new URL(url);
    conn = realUrl.openConnection();
  } catch (IOException e1) {
    e1.printStackTrace();
  }
  if (headers != null) {
    for (Map.Entry<String, String> e : headers.entrySet()) {
      conn.setRequestProperty(e.getKey(), e.getValue());
    }
  }
  // 定義BufferedReader輸入流來讀取URL的響應
  BufferedReader in = null;
  StringBuffer strBuf = new StringBuffer();

  try {
    InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream());
    in = new BufferedReader(inputStreamReader);
    String line;
    while ((line = in.readLine()) != null) {
      strBuf.append(line);
      strBuf.append("\r\n");
    }
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
      in.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  return strBuf;
}

使用get方法

Map<String, String> hdeader = new HashMap<>();
hdeader.put("content-type", "application/json");
StringBuffer strBuf = get(url, hdeader);

發送post請求

發送 post json

PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
  URL realUrl = new URL(url);
  // 打開和URL之間的連接
  URLConnection conn = realUrl.openConnection();
  // 設置user-agent
  conn.setRequestProperty("user-agent", "Koala Admin");
  // 指定文本類型爲JSON格式
  conn.setRequestProperty("content-type", "application/json");
  // 發送POST請求必須設置如下兩行
  conn.setDoOutput(true);
  conn.setDoInput(true);
  // 獲取URLConnection對象對應的輸出流
  out = new PrintWriter(conn.getOutputStream());
  // 發送請求參數
  out.print(param);
  // flush輸出流的緩衝
  out.flush();
  // 定義BufferedReader輸入流來讀取URL的響應
  InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream());
  in = new BufferedReader(inputStreamReader);
  String line;
  while ((line = in.readLine()) != null) {
    result += line;
  }
  // 保存sessionId
  readCookies(conn);
} catch (Exception e) {
  System.out.println("發送 POST 請求出現異常!" + e);
  e.printStackTrace();
}
// 使用finally塊來關閉輸出流、輸入流
finally {
  try {
    if (out != null) {
      out.close();
    }
    if (in != null) {
      in.close();
    }
  } catch (IOException ex) {
    ex.printStackTrace();
  }
}

如果發送的不是json格式

// 建立輸入流,向指向的URL傳入參數 ,支持的格式是 key=value&key=value
dos = new DataOutputStream(httpConn.getOutputStream());
dos.writeBytes(urlParam.toString());
dos.flush();

封裝工具類

JdkHttpClient

package com.bill.utils.http;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 接口調用工具類 目前支持 GET POST請求兩種方式
 */
public class JdkHttpClient {
  private static URL initUrl(String url) {
    try {
      return new URL(url);
    } catch (MalformedURLException e) {
      e.printStackTrace();
    }
    return null;
  }

  private static URL initUrl(String url, Map<String, String> params) {
    StringBuffer urlParam = buildHttpQueryParams(params);
    try {
      return new URL(url + (urlParam.length() > 0 ? "?" + urlParam.toString() : ""));
    } catch (MalformedURLException e1) {
      e1.printStackTrace();
    }
    return null;
  }

  @SuppressWarnings("deprecation")
  public static StringBuffer buildHttpQueryParams(Map<String, String> params) {
    StringBuffer sb = new StringBuffer();
    for (Entry<String, String> e : params.entrySet()) {
      sb.append(e.getKey() + "=" + URLEncoder.encode(e.getValue().toString()) + "&");
    }
    if (sb.length() > 0) {
      sb.deleteCharAt(sb.lastIndexOf("&"));
    }
    return sb;
  }

  public static HttpURLConnection initHttpUrl(String url, Map<String, String> headers, Map<String, String> params) {
    URL realURL = null;

    if (params != null) {
      realURL = initUrl(url, params);
    } else {
      realURL = initUrl(url);
    }
    HttpURLConnection httpConnection = null;
    try {
      httpConnection = (HttpURLConnection) realURL.openConnection();
    } catch (IOException e1) {
      e1.printStackTrace();
    }
    if (headers != null) {
      for (Map.Entry<String, String> e : headers.entrySet()) {
        httpConnection.setRequestProperty(e.getKey(), e.getValue());
      }
    }
    return httpConnection;
  }

  private static String getFailMessage(HttpURLConnection conn) {
    try {
      return "code : " + conn.getResponseCode() + " url:" + conn.getURL().toString();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return null;
  }

  public static StringBuffer getResponseString(URLConnection conn) {
    // 定義BufferedReader輸入流來讀取URL的響應
    BufferedReader in = null;
    StringBuffer strBuf = new StringBuffer();
    String line;
    try {
      InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream());
      in = new BufferedReader(inputStreamReader);
      while ((line = in.readLine()) != null) {
        strBuf.append(line);
        strBuf.append("\r\n");
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      close(in);
    }
    return strBuf;
  }

  public static void close(AutoCloseable io) {
    if (io != null) {
      try {
        io.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * get請求
   * 
   * @param url
   * @param param
   * @return
   */
  public static StringBuffer get(String url, Map<String, String> headers, Map<String, String> params) {
    // 初始化請求
    HttpURLConnection httpConnection = initHttpUrl(url, headers, params);
    // 設置請求方法
    try {
      httpConnection.setRequestMethod("GET");
    } catch (ProtocolException e1) {
      e1.printStackTrace();
    }
    // 讀取數據
    StringBuffer sb = null;
    try {
      if (httpConnection.getResponseCode() != HttpURLConnection.HTTP_OK) {
        String msg = getFailMessage(httpConnection);
        throw new RuntimeException("HTTP GET Request Failed with Error " + msg);
      } else {
        sb = getResponseString(httpConnection);
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      httpConnection.disconnect();
    }
    return sb;
  }

  /**
   * 向指定URL發送post請求
   */
  public static String post(String url, Map<String, String> headers, Map<String, String> params) {
    HttpURLConnection httpConn = postStream(url, headers, params);

    StringBuffer sb = null;
    try {
      // 讀取響應
      if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
        sb = getResponseString(httpConn);
      } else {
        throw new RuntimeException("HTTP POST Request Failed with Error " + getFailMessage(httpConn));
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      httpConn.disconnect();// 斷開連接
    }
    return sb.toString();
  }

  /**
   * 返回HttpURLConnection
   * 自行從HttpURLConnection中獲取流進行保存
   * 
   */
  public static HttpURLConnection postStream(String url, Map<String, String> headers, Map<String, String> params) {
    StringBuffer urlParam = buildHttpQueryParams(params);
    HttpURLConnection httpConn = initHttpUrl(url, headers, null);

    // 設置參數
    httpConn.setDoOutput(true); // 需要輸出
    httpConn.setDoInput(true); // 需要輸入
    httpConn.setUseCaches(false); // 不允許緩存
    try {
      httpConn.setRequestMethod("POST");
    } catch (ProtocolException e1) {
      e1.printStackTrace();
    } // 設置POST方式連接
    httpConn.setInstanceFollowRedirects(true); // 設置跟隨重定向
    // 連接,也可以不用明文connect,使用下面的httpConn.getOutputStream()會自動connect
    // httpConn.connect();

    DataOutputStream dos = null;
    try {
      // 建立輸入流,向指向的URL傳入參數 ,支持的格式是 key=value&key=value
      dos = new DataOutputStream(httpConn.getOutputStream());
      dos.writeBytes(urlParam.toString());
      dos.flush();
    } catch (IOException e1) {
      e1.printStackTrace();
    } finally {
      close(dos);
    }
    return httpConn;
  }
}

使用工具類

使用案例

import java.util.HashMap;
import java.util.Map;

import com.litong.utils.http.alithttpclient.JdkHttpClient;

public class BiaoBeiClient {
  private String accessTokenUrl = "https://openapi.data-baker.com/oauth/2.0/token";
  private String checkTokenUrl = "https://openapi.data-baker.com/api/checkToken";
  private String ttsUrl = "https://openapi.data-baker.com/tts";
  private String clientId = "xxe";
  private String clientSecret = "xxx";

  public String getAccessToken() {
    HashMap<String, String> params = new HashMap<>();
    params.put("grant_type", "client_credentials");
    params.put("client_id", clientId);
    params.put("client_secret", clientSecret);
    StringBuffer strBuf = JdkHttpClient.get(accessTokenUrl, null, params);
    return strBuf.toString();
  }

  public String checkToken(String accessToken) {
    Map<String, String> hdeader = new HashMap<>();
    hdeader.put("content-type", "application/json");
    Map<String, String> params = new HashMap<>();
    params.put("access_token", accessToken);
    StringBuffer strBuf = JdkHttpClient.get(checkTokenUrl, hdeader, params);
    return strBuf.toString();
  }

  public String tts(String accessToken, String language, String voiceName, String text) {
    Map<String, String> params = new HashMap<>();
    params.put("access_token", accessToken);
    params.put("domain", "1");
    params.put("language", language);
    params.put("voice_name", voiceName);
    params.put("text", text);
    StringBuffer strbuf = JdkHttpClient.post(ttsUrl, null, params);
    return strbuf.toString();
  }
}
  private String accessToken;
  private Long expireTime = 0L;

  public boolean isExpires() {
    return System.currentTimeMillis() > expireTime;
  }

  public String getAccessToken() {
    HashMap<String, String> params = new HashMap<>();
    params.put("grant_type", "client_credentials");
    params.put("client_id", clientId);
    params.put("client_secret", clientSecret);
    StringBuffer strBuf = JdkHttpClient.get(accessTokenUrl, null, params);
    return strBuf.toString();
  }

  public String checkToken(String accessToken) {
    Map<String, String> hdeader = new HashMap<>();
    hdeader.put("content-type", "application/json");
    Map<String, String> params = new HashMap<>();
    params.put("access_token", accessToken);
    StringBuffer strBuf = JdkHttpClient.get(checkTokenUrl, hdeader, params);
    return strBuf.toString();
  }

  public String tts(String accessToken, String language, String voiceName, String text) {
    Map<String, String> params = new HashMap<>();
    params.put("access_token", accessToken);
    params.put("domain", "1");
    params.put("language", language);
    params.put("voice_name", voiceName);
    params.put("text", text);
    StringBuffer strbuf = JdkHttpClient.post(ttsUrl, null, params);
    return strbuf.toString();
  }
}

 

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