使用HTTP協議訪問網路
阿新 • • 發佈:2018-12-05
一.使用HttpURLConnection
①首先獲取HttpURLConnection的例項
URL url = new URL("https://www.baidu.com");
connection = (HttpURLConnection)url.openConnection();
②在得到HttpURLConnection的例項後,可以設定HTTP請求所使用的方法。常用的方法主要有兩個:GET和POST。GET表示從伺服器那裡獲取資料,POST則是將資料提交給伺服器。
connection.setRequestMethod("GET");
③自由定製
// 設定是否使用快取 connection.setUseCaches(true); // 設定此 HttpURLConnection 例項是否應該自動執行 HTTP 重定向 connection.setInstanceFollowRedirects(true); // 設定超時時間 connection.setConnectTimeout(3000);
④利用getInputStream()方法獲取輸入流,然後讀取
InputStream in =connection.getInputStream();
⑤關閉HTTP連線
if(connection != null){
connection.disconnect();
}
⑥完整Activity程式碼
package com.example.administrator.myapplication; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpActivity extends AppCompatActivity implements View.OnClickListener { TextView mtx; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.http); Button btn = findViewById(R.id.button2); mtx = findViewById(R.id.textView); btn.setOnClickListener(this); } @Override public void onClick(View v) { if(v.getId() == R.id.button2){ sendRequstHttp(); } } private void sendRequstHttp() { new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; BufferedReader reader = null; try{ URL url = new URL("https://www.baidu.com"); connection = (HttpURLConnection)url.openConnection(); /* connection.setRequestMethod("POST"); DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.writeBytes("username=admin&password=123456");向伺服器傳值*/ //請求方式 connection.setRequestMethod("GET"); //連線超出時間 connection.setConnectTimeout(8000); //獲取內容超時 connection.setReadTimeout(8000); InputStream in =connection.getInputStream(); reader = new BufferedReader((new InputStreamReader(in))); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null){ response.append(line); } showResponse(response.toString()); }catch (Exception e){ e.printStackTrace(); }finally { if(reader != null){ try { reader.close(); }catch (IOException e){ e.printStackTrace(); } } if(connection != null){ connection.disconnect(); } } } }).start(); } private void showResponse(final String response) { runOnUiThread(new Runnable() { @Override public void run() { mtx.setText(response); } }); } }
完整xml檔案
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </ScrollView> </LinearLayout>
需要在AndroidManifest.xml中新增許可權
<uses-permission android:name="android.permission.INTERNET" />
二.使用OkHttp
①首先在app/build.gradle檔案中的dependencies閉包新增如下內容
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
②然後建立一個OkHttpClient的例項
OkHttpClient client = new OkHttpClient();
③建立一個Request物件
Request request = new Request.Builder().url("https://www.baidu.com").build();
④呼叫OkHttpClient的newCall方法來建立一個Call物件,並呼叫它的execute()方法來發生請求並獲取伺服器返回的資料
Response response = client.newCall(request).execute();
⑤用如下方法獲取具體內容
String responseData = response.body().string();
使用POST請求
如果發起一條POST請求,首先構建一個RequestBody物件來存放代提交的引數
RequestBody requestBody = new FormBody.Builder().add("1","1").build();
然後在Request.Builder中呼叫post()方法,並將RequestBody物件傳入
Request request = new Request.Builder().url("https://www.baidu.com").post(requestBody).build();
具體程式碼如下
package com.example.administrator.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class OkHttpActivity extends AppCompatActivity implements View.OnClickListener {
TextView mtx;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.http);
Button btn = findViewById(R.id.button2);
mtx = findViewById(R.id.textView);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.button2){
sendRequestOkHttp();
}
}
private void sendRequestOkHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
/* RequestBody requestBody = new FormBody.Builder().add("1","1").build();
Request request = new Request.Builder().url("https://www.baidu.com").post(requestBody).build();*/
Request request = new Request.Builder().url("https://www.baidu.com").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mtx.setText(response);
}
});
}
}