在項目開發(fā)中,都會涉及到網(wǎng)絡的請求括改,okhttp的話是谷歌官方推薦的一個網(wǎng)絡請求框架嘱能,支持異步GET請求、異步POST請求焰檩、異步上傳文件、異步下載文件等多種操作析苫, 這里主要說的是okhttp json格式請求數(shù)據(jù)情況下的異步POST請求衩侥、okhttp的https認證以及圖片上傳。
引入依賴庫:
compile files('libs/okhttp-3.7.0.jar')
compile files('libs/okio-1.9.0.jar')
添加網(wǎng)絡權限:
<uses-permission android:name="android.permission.INTERNET"/>
okhttp的https認證:
下面寫的https認證采用的是單項認證跪但,不是雙向認證峦萎;
/**
* 以下為https的認證,這里采用的是https的單項認證 okhttp不驗證直接通過通過所有的https連接
*
* @author miao
*/
private static class TrustAllCerts implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers()
return new X509Certificate[0];
}
}
@SuppressWarnings("unused")
private static class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}
return ssfFactory;
}
上面這些就是https的單項認證被环,在調用okhttp請求網(wǎng)絡的時候進行設置認證就可以了筛欢;
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
/**
* 請求網(wǎng)絡 https認證
* @param context 上下文
* @param jsonData json字符串數(shù)據(jù)
* @param doRequestUrl 請求鏈接
*/
public static void requestTask(Context context,String jsonData,String doRequestUrl){
if(context==null){
return;
}
OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(createSSLSocketFactory()).hostnameVerifier(new TrustAllHostnameVerifier())// https認證
.connectTimeout(30000, TimeUnit.MILLISECONDS).readTimeout(35000, TimeUnit.MILLISECONDS)// 設置連接時間和讀取時間
.build();// 設置緩存
RequestBody body = RequestBody.create(JSON, jsonData);
Request request = new Request.Builder().url(doRequestUrl).post(body).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//失敗回調 回調是在子線程中版姑,可使用Handler迟郎、post、activity.runOnUiThread()等方式在主線程中更新ui
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//成功回調 可使用Handler炒嘲、post匈庭、activity.runOnUiThread()等方式在主線程中更新ui
//獲取返回byte數(shù)組
byte[] bytes1 = response.body().bytes();
String resultData = new String(bytes1);
}
});
}
上面的所謂的json格式的請求數(shù)據(jù)就是類似于下面的數(shù)據(jù)格式:
{"data":{"address":"廣州","id":1,"name":"xiaoluo"}}
okhttp圖片提交請求:
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
/**
* okhttp提交圖片請求
* @param mContext 上下文
* @param imageUrl 圖片本地地址
* @param requestUrl 請求鏈接
*/
public static void doPicTaskInfo(Context mContext, String imageUrl,String requestUrl){
if(mContext==null){
return;
}
//設置連接阱持,讀寫時間
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(25000, TimeUnit.MILLISECONDS).writeTimeout(30000, TimeUnit.MILLISECONDS)
.readTimeout(30000, TimeUnit.MILLISECONDS).build();
final File f = new File(imageUrl);
MultipartBody.Builder mbody = new MultipartBody.Builder().setType(MultipartBody.FORM);
if (f != null) {
mbody.addFormDataPart("image", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
}
MultipartBody requestBody = mbody.build();
//構建請求
Request request = new Request.Builder()
.url(requestUrl)//地址
.post(requestBody)//添加請求體
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//失敗回調 回調是在子線程中,可使用Handler蒜绽、post桶现、activity.runOnUiThread()等方式在主線程中更新ui
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//成功回調 可使用Handler、post相赁、activity.runOnUiThread()等方式在主線程中更新ui
//請求成功
byte[] bytes = response.body().bytes();
String result = new String(bytes);
}
});
}