OkHttp是用於網路連線的第三方套件,相對於原生的AsyncTask連線方式,OkHttp的連線效率更高,具有取消連線和快取等機制,且程式碼更為簡潔好寫。
compile 'com.squareup.okhttp3:okhttp:3.5.0'
使用網路連線時須在AndroidManifet.xml中加入INTERNET權限
<uses-permission android:name="android.permission.INTERNET" />
OkHttp的連線由三個部分組成:
我們用JSONPlaceholder提供的測試資料來做練習
GET測試網址 https://jsonplaceholder.typicode.com/posts/1
public class MainActivity extends AppCompatActivity {
// 建立OkHttpClient
OkHttpClient client = new OkHttpClient().newBuilder().build();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 建立Request,設置連線資訊
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// 建立Call
Call call = client.newCall(request);
// 執行Call連線到網址
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
// 連線成功,自response取得連線結果
String result = response.body().string();
Log.d("OkHttp result", result);
}
@Override
public void onFailure(Call call, IOException e) {
// 連線失敗
}
});
}
}
執行APP,下方Log處就可以看到連線取回的結果
POST連線時可以用FormBody來放資料,並將FormBody交給Request,其他部分跟GET相同
POST測試網址 https://jsonplaceholder.typicode.com/posts
public class MainActivity extends AppCompatActivity {
// 建立OkHttpClient
OkHttpClient client = new OkHttpClient().newBuilder().build();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// FormBody放要傳的參數和值
FormBody formBody = new FormBody.Builder()
.add("userId", "1")
.add("id", "1")
.add("title", "OkHttp post practice")
.build();
// 建立Request,設置連線資訊
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(formBody) // 使用post連線
.build();
// 建立Call
Call call = client.newCall(request);
// 執行Call連線到網址
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
// 連線成功
String result = response.body().string();
Log.d("OkHttp result", result);
}
@Override
public void onFailure(Call call, IOException e) {
// 連線失敗
}
});
}
}
執行結果,因測試網站並無真實資料,我們POST什麼值它就傳回什麼,所以看到跟丟的參數一樣就是對囉
另外推薦使用OkHttp提供的LoggingInterceptor,會幫我們在Log印出每次連線的網址、狀態碼和耗費時間等等,而且只要加入一行程式碼就搞定哦
加入dependencies
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
在OkHttpClient加入Intercaptor
OkHttpClient client = new OkHttpClient().newBuilder()
.addInterceptor(new HttpLoggingInterceptor().setLevel(Level.BASIC))
.build();
連線時就可以在Log看到資訊
今天介紹的是OkHttp的基本用法,可以處理一般的GET和POST連線,在官方Wiki中有更多詳細的介紹如同步連線和Interceptor運用等等,大家有空可以去逛逛。明天介紹同為Square公司出品的Retrofit,是個專為API連線特化的套件哦。