一、作用
一般的get請求
一般的post請求
基於Http的文件上傳
文件下載
加載圖片
支持請求回調,直接返回對象、對象集合
支持session的保持
二、導包
導入okhttp3.6.0和okio包
三、get和post請求
1、get請求
1) OkHttpClient:新建一個OkHttpClient實例,用於處理請求。
2) Request:構建請求參數,如url,請求方式,請求參數,header等。
3) Call:生成一個具體請求實例,相當於將請求封裝成了任務;兩種方式:
①、call.execute(),非異步方式,會阻塞線程,等待返回結果。
②、call.enqueue(Callback),異步方式。裏面有onFailure()和onResponse()方法只能運行在非主線程,不能進行UI操作。可以用handler去操作UI界面。
4) Response:結果響應。
response.body().string()–>返回字符串(小文檔);
.bytes()–>返回二進制字節數組
.byteStream()–>返回InputStream(超過1M的用這個)
2、Post請求
同上面差不多,但需要增加RequestBody(存放json數據)RequestBody.create(Json,json);或FormBody.Builder(存放表單)FormBody.Builder().add(“key”,”name”);來存儲請求的參數信息,在Request.Builder增加post(RequestBody)的調用。
package com.example.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* author:黃夏蓮
* time:2017.04.10
*/
public class MainActivity extends AppCompatActivity {
Executors me;
ExecutorService executorService;
String url = "https://www.baidu.com/";
String []json=new String[]{"abc"};
private Headers headers;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* executorService = me.newFixedThreadPool(5);
for(int i=0;i<20;i++){
Runnable r = new Runnable() {
@Override
public void run() {
Log.i("TAG",Thread.currentThread().getName());
}
};
executorService.execute(r);
}*/
/*1) OkHttpClient:新建一個OkHttpClient實例,用於處理請求。
2) Request:構建請求參數,如url,請求方式,請求參數,header等。
3) Call:生成一個具體請求實例,相當於將請求封裝成了任務;兩種方式:
①、call.execute(),非異步方式,會阻塞線程,等待返回結果。
②、call.enqueue(Callback),異步方式。
4) Response:結果響應。
*/
new Thread(new Runnable() {
@Override
public void run() {
// onGetNet();
try {
//提交json數據
// String a = post(url,json[0]);
String a = postString(url);
Log.i("TAG",a);
for(int i=0;i<headers.size();i++){
Log.i("TAG",headers.name(i)+":"+headers.value(i)+";");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
//get異步
public void onGetNet() {
final String url = "https://www.baidu.com/";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("TAG", "網絡請求失敗");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("TAG", "網絡請求成功" + "response.body().string():" + response.body().string());
}
});
}
//get非異步
private String run(String url) throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
//post
//①提交json數據
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
//②提交字符串
String postString(String url)throws IOException {
FormBody formBody = new FormBody.Builder().add("name", "aaa").add("age", "13").build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
Response response = client.newCall(request).execute();
headers = response.headers();
return response.body().string();
}
}