Android 開發之訪問網路
阿新 • • 發佈:2019-01-26
現在訪問網路有好多非常優秀的框架,比如 OKHTTP,Volley 等等,但是最基本的 HttpURLConnection 用法我們不能忘記,由於 HttpClient 在 Android6.0 系統上已被廢棄,這裡就不寫了,訪問網路無非是使用 http 協議(本文介紹了使用 https 協議的例子,很遺憾,本人還沒完全弄清楚,以後再深究)
用 HttpURLConnection 訪問網路
/**
address:訪問的網路地址
listener:監聽
*/
public static void sendHttpRequest(final String address, final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
InputStream inputStream = null;
try {
URL url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET" );
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.connect();
if (connection.getResponseCode() == 200 ) {
inputStream = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
if (listener != null) {
listener.onFinish(sb.toString());//從伺服器獲得的資料返回給呼叫方(依然是在子執行緒)
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
if (listener != null) {
listener.onFailed(e);//失敗
}
} finally {
if (connection != null) {
connection.disconnect();
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
HttpCallbackListener介面
public interface HttpCallbackListener {
void onFinish(String response);
void onFailed(Exception e);
}
把從伺服器中讀取的內容轉換為字串
public static String readFromStream(InputStream is) throws IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int len = 0;
while((len =is.read(buff))!= -1){
baos.write(buff, 0, len);
}
String result = baos.toString();
is.close();
baos.flush();
baos.close();
return result;
}
使用https協議
public static void sendHttpRequest(final String address, final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpsURLConnection connection = null;
InputStream inputStream = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new MyTrustManager()}, new SecureRandom());
URL url = new URL(address);
connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sc.getSocketFactory());
connection.setHostnameVerifier(new MyHostnameVerifier());
connection.connect();
if (connection.getResponseCode() == 200) {
inputStream = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
if (listener != null) {
listener.onFinish(sb.toString());//從伺服器獲得的資料返回給呼叫方(依然是在子執行緒)
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
if (listener != null) {
listener.onFailed(e);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
用到的MyHostnameVerifier和MyTrustManager類
private static class MyHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
// TODO Auto-generated method stub
return true;
}
}
private static class MyTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
使用OkHttp框架訪問網路,使用回撥函式返回資料
public static void sendOkHttpRequest(String url, okhttp3.Callback callback) {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(callback);
}
PS:其實上面思路也是常用的,在郭神《第一行程式碼第二版》有詳細講解。。。