一)URL代理請求
該方式請求有兩種代理方式。
方式一:使用該方式代理之後,之後的所有接口都會使用代理請求
// 對http開啓全局代理
System.setProperty("http.proxyHost", "192.168.1.1");
System.setProperty("http.proxyPort", "80");
// 對https開啓全局代理
System.setProperty("https.proxyHost", "192.168.1.1");
System.setProperty("https.proxyPort", "80");
方式二:適用於只有部分接口需要代理請求場景
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress("192.168.1.1", 80));
HttpURLConnection conn = null;
try {
URL url = new URL("http://localhost:8080/ouyangjun");
conn = (HttpURLConnection) url.openConnection(proxy);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
二)無參數GET請求
方法解析:
HttpGetUtils.doGetNoParameters(String requestURL, String proxyHost, Integer proxyPort);
requestURL:請求路徑,必填
proxyHost:代理IP,即服務器代理地址,可爲null
proxyPort:代理端口,可爲null
說明:一般本地測試幾乎是不會用代理的,只有服務器用代理方式請求比較多。
實現源碼:
package com.ouyangjun.wechat.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.URL;
/**
* http請求工具類
* @author ouyangjun
*/
public class HttpGetUtils {
/**
* http get請求, 不帶參數
* @param requestURL
* @param method
* @return
*/
public static String doGetNoParameters(String requestURL, String proxyHost, Integer proxyPort) {
// 記錄信息
StringBuffer buffer = new StringBuffer();
HttpURLConnection conn = null;
try {
URL url = new URL(requestURL);
// 判斷是否需要代理模式請求http
if (proxyHost != null && proxyPort != null) {
// 如果是本機自己測試, 不需要代理請求,但發到服務器上的時候需要代理請求
// 對http開啓全局代理
//System.setProperty("http.proxyHost", proxyHost);
//System.setProperty("http.proxyPort", proxyPort);
// 對https開啓全局代理
//System.setProperty("https.proxyHost", proxyHost);
//System.setProperty("https.proxyPort", proxyPort);
// 代理訪問http請求
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
conn = (HttpURLConnection) url.openConnection(proxy);
} else {
// 原生訪問http請求,未代理請求
conn = (HttpURLConnection) url.openConnection();
}
// 設置請求的屬性
conn.setDoOutput(true); // 是否可以輸出
conn.setRequestMethod("GET"); // 請求方式, 只包含"GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"六種
conn.setConnectTimeout(60000); // 最高超時時間
conn.setReadTimeout(60000); // 最高讀取時間
conn.setConnectTimeout(60000); // 最高連接時間
// 讀取數據
InputStream is = null;
InputStreamReader inputReader = null;
BufferedReader reader = null;
try {
is = conn.getInputStream();
inputReader = new InputStreamReader(is, "UTF-8");
reader = new BufferedReader(inputReader);
String temp;
while ((temp = reader.readLine()) != null) {
buffer.append(temp);
}
} catch (Exception e) {
System.out.println("HttpGetUtils doGetNoParameters error: " + e);
} finally {
try {
if (reader != null) {
reader.close();
}
if (inputReader != null) {
inputReader.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
System.out.println("HttpGetUtils doGetNoParameters error: " + e);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 當http連接空閒時, 釋放資源
if (conn != null) {
conn.disconnect();
}
}
// 返回信息
return buffer.length()==0 ? "" : buffer.toString();
}
}
三)帶參數POST請求
方法解析:
HttpPostUtils.doPost(String requestURL, String params, String proxyHost, Integer proxyPort);
requestURL:請求路徑,必填
params:請求參數,必填,數據格式爲JSON
proxyHost:代理IP,即服務器代理地址,可爲null
proxyPort:代理端口,可爲null
說明:一般本地測試幾乎是不會用代理的,只有服務器用代理方式請求比較多。
實現源碼:
package com.ouyangjun.wechat.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.URL;
/**
* http請求工具類
* @author ouyangjun
*/
public class HttpPostUtils {
/**
* http post請求, 帶參數
* @param requestURL
* @param params
* @return
*/
public static String doPost(String requestURL, String params, String proxyHost, Integer proxyPort) {
// 記錄信息
StringBuffer buffer = new StringBuffer();
HttpURLConnection conn = null;
try {
URL url = new URL(requestURL);
// 判斷是否需要代理模式請求http
if (proxyHost != null && proxyPort != null) {
// 如果是本機自己測試, 不需要代理請求,但發到服務器上的時候需要代理請求
// 對http開啓全局代理
//System.setProperty("http.proxyHost", proxyHost);
//System.setProperty("http.proxyPort", proxyPort);
// 對https開啓全局代理
//System.setProperty("https.proxyHost", proxyHost);
//System.setProperty("https.proxyPort", proxyPort);
// 代理訪問http請求
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
conn = (HttpURLConnection) url.openConnection(proxy);
} else {
// 原生訪問http請求,未代理請求
conn = (HttpURLConnection) url.openConnection();
}
// 設置請求的屬性
conn.setDoOutput(true); // 是否可以輸出
conn.setRequestMethod("POST"); // 請求方式, 只包含"GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"六種
conn.setConnectTimeout(60000); // 最高超時時間
conn.setReadTimeout(60000); // 最高讀取時間
conn.setConnectTimeout(60000); // 最高連接時間
conn.setDoInput(true); // 是否可以輸入
if (params != null) {
// 設置參數爲json格式
conn.setRequestProperty("Content-type", "application/json");
// 寫入參數信息
OutputStream os = conn.getOutputStream();
try {
os.write(params.getBytes("UTF-8"));
} catch (Exception e) {
System.out.println("HttpPostUtils doPost error: " + e);
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
System.out.println("HttpPostUtils doPost error: " + e);
}
}
}
// 讀取數據
InputStream is = null;
InputStreamReader inputReader = null;
BufferedReader reader = null;
try {
is = conn.getInputStream();
inputReader = new InputStreamReader(is, "UTF-8");
reader = new BufferedReader(inputReader);
String temp;
while ((temp = reader.readLine()) != null) {
buffer.append(temp);
}
} catch (Exception e) {
System.out.println("HttpPostUtils doPost error: " + e);
} finally {
try {
if (reader != null) {
reader.close();
}
if (inputReader != null) {
inputReader.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
System.out.println("HttpPostUtils doPost error: " + e);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 當http連接空閒時, 釋放資源
if (conn != null) {
conn.disconnect();
}
}
// 返回信息
return buffer.length()==0 ? "" : buffer.toString();
}
}
四)Http模擬測試
本案例是使用了微信公衆號兩個接口作爲了測試案例。
appID和appsecret需要申請了微信公衆號才能獲取到。
package com.ouyangjun.wechat.test;
import com.ouyangjun.wechat.utils.HttpGetUtils;
import com.ouyangjun.wechat.utils.HttpPostUtils;
public class TestHttp {
private final static String WECHAT_APPID=""; // appid, 需申請微信公衆號才能拿到
private final static String WECHAT_APPSECRET=""; // appsecret, 需申請微信公衆號才能拿到
public static void main(String[] args) {
// 獲取微信公衆號token
getWeChatToken();
// 修改用戶備註信息
String token = "31_1uw5em_HrgkfXok6drZkDZLKsBfbNJr9WTdzdkc_Tdat-9tpOezWsNI6tBMkyPe_zDHjErIS1r0dgnTpT5bfKXcASShJVhPqumivRP21PvQe3Cbfztgs1IL2Jpy7kw3Y09bC1urlWzDA52mtEDGcADAVUX";
String openid = "oCh4n0-6JKQpJgBOPA5tytoYb0VY";
updateUserRemark(token, openid);
}
/**
* 根據appid和appsecret獲取微信token,返回json格式數據,需自行解析
* @return
*/
public static String getWeChatToken() {
String requestURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+WECHAT_APPID+"&secret="+WECHAT_APPSECRET;
String token = HttpGetUtils.doGetNoParameters(requestURL, null, null);
System.out.println("wechat token: " + token);
return token;
}
/**
* 修改用戶備註,返回json格式數據,需自行解析
* @param token
* @param openid
* @return
*/
public static String updateUserRemark(String token, String openid) {
String reuqestURL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token="+token;
// 封裝json參數
String jsonParams = "{\"openid\":\""+openid+"\",\"remark\":\"oysept\"}";
String msg = HttpPostUtils.doPost(reuqestURL, jsonParams, null, null);
System.out.println("msg: " + msg);
return jsonParams;
}
}
識別二維碼關注個人微信公衆號
本章完結,待續,歡迎轉載!
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!