Android Studio 添加依賴:
compile 'com.squareup.okhttp3:okhttp:3.8.0'
新的版本中已經(jīng)內(nèi)置了okio牙躺,不需要額外添加了
Get請求
OkHttp執(zhí)行網(wǎng)絡(luò)請求有兩種方式,同步(execute)和異步(enqueue)惦界,他們的使用方法是基本一樣的。下面是同步和異步的方式分別請求百度:
//同步方式
@OnClick(R.id.okhttp_get)
void getBaidu(){
//構(gòu)建Client對象
OkHttpClient okHttpClient = new OkHttpClient();
//設(shè)置請求
Request request = new Request.Builder().url("https://www.baidu.com").method("GET",null).build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
//同步的方式建立連接
final Response response = call.execute();
final String result = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText(result);
}
});
} catch (IOException e) {
e.printStackTrace();
Log.d("okhttp3", "lianjie shibai ");
}
}
}).start();
}
//異步方式
@OnClick(R.id.okhttp_get_async)
void geBaiduAsync(){
//構(gòu)建Client對象
OkHttpClient okHttpClient = new OkHttpClient();
//設(shè)置請求
Request request = new Request.Builder().url("https://www.baidu.com").method("GET",null).build();
final Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("okhttp3", "connection established fail ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText(result);
}
});
}
});
}
同步方式調(diào)用的是execute,運(yùn)行在當(dāng)前線程丸氛,所以要分配子線程給它罚舱。異步的方式會自動分配子線程井辜,執(zhí)行完畢之后回調(diào)CallBack绎谦。
onResponse回調(diào)的參數(shù)是response,一般情況下粥脚,比如我們希望獲得返回的字符串窃肠,可以通過response.body().string()
獲取刷允;如果希望獲得返回的二進(jìn)制字節(jié)數(shù)組冤留,則調(diào)用response.body().bytes();
如果你想拿到返回的inputStream树灶,則調(diào)用response.body().byteStream()
纤怒,獲取返回狀態(tài)碼使用response.code()
添加請求頭:
Request request = new Request.Builder()
.url("https://www.baidu.com")
.method("GET",null)
.header("name","value")//添加的參數(shù)具有唯一性,會移除之前設(shè)置的name值
.addHeader("name","value")//可以對同樣的name設(shè)置多個值天通,不會移除之前的值
.build();
獲取響應(yīng)內(nèi)容也是類似的泊窘,調(diào)用Response的header,headers方法像寒。另外烘豹,Client里還有設(shè)置超時的方法:
okHttpClient.connectTimeoutMillis();
okHttpClient.readTimeoutMillis();
Post請求
OkHttp使用RequestBody來裝載Post請求中的body(包括content-type和內(nèi)容),使用方法如下:
//提交字符串
@OnClick(R.id.okhttp_post)
void postString(){
//設(shè)置content-type
MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
//要提交的內(nèi)容
String postBody = "Hello World";
//構(gòu)建Client對象
OkHttpClient okHttpClient = new OkHttpClient();
//設(shè)置請求
Request request = new Request.Builder()
.url("https://www.baidu.com")
.method("GET",null)
//post內(nèi)容添加到Request中
.post(RequestBody.create(MEDIA_TYPE_TEXT,postBody))
.build();
}
//提交鍵值對诺祸,3.0以后使用FormBody携悯,也可以直接接收兩個存儲key和value的List<String>,作為參數(shù)
void postKeyValue(){
RequestBody formBody = new FormBody.Builder()
.add("platform", "android")
.add("name", "bug")
.add("subject", "XXXXXXXXXXXXXXX")
.build();
//構(gòu)建Client對象
OkHttpClient okHttpClient = new OkHttpClient();
//設(shè)置請求
Request request = new Request.Builder()
.url("https://www.baidu.com")
.method("GET",null)
.post(formBody)
.build();
}
//提交Json
void postJson(){
final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
String json = "";
//構(gòu)建Client對象
OkHttpClient okHttpClient = new OkHttpClient();
//設(shè)置請求
Request request = new Request.Builder()
.url("https://www.baidu.com")
.method("GET",null)
.post(RequestBody.create(MEDIA_TYPE_JSON,json))
.build();
}
攔截器
Okhttp 中內(nèi)置了攔截器功能序臂,它可以在網(wǎng)絡(luò)請求中進(jìn)行更多操作蚌卤。
class MyInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
return response;
}
}
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().addInterceptor(new MyInterceptor() ).build();
chain.proceed(request)是每個攔截器實現(xiàn)的關(guān)鍵部分。這個方法是所有HTTP 工作發(fā)生的地方奥秆, 在這里產(chǎn)生一個響應(yīng)應(yīng)答請求逊彭。
這里添加攔截器使用的是addInterceptor方法,除此之外還有addNetworkInterceptor方法用來添加網(wǎng)絡(luò)攔截器构订。