當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3
生活随笔
收集整理的這篇文章主要介紹了
OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OkHttp協議
okhttp是一個第三方類庫,用于android中請求網絡
這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary)
文件下載用Get方式
OkHttpClient okHttpClient = new OkHttpClient.Builder().callTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build();Request request = new Request.Builder().url(u).get().build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {ResponseBody body = response.body();long length = body.contentLength();Message message = Message.obtain();message.what = Model.DownLoad_Max;message.obj = (int)length;handler.sendMessage(message);InputStream inputStream = body.byteStream();FileOutputStream fileOutputStream = new FileOutputStream(path);byte[] bytes = new byte[1024];int len = 0;int count = 0;while ((len=inputStream.read(bytes))!=-1) {count+=len;fileOutputStream.write(bytes,0,len);Message message1 = Message.obtain();message1.what = Model.DownLoad_Progress;message1.obj = count;handler.sendMessage(message1);}}});文件上傳用Post方式
OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).callTimeout(5, TimeUnit.SECONDS).build();MultipartBody multipartBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file",filename, RequestBody.create(MediaType.parse("image/jpg"),new File(path))).build();Request request = new Request.Builder().url(u).post(multipartBody).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {handler.sendEmptyMessage(Model.UpLoad_Finish);}});OkHttp協議封裝
將OkHttp封裝成工具類并寫上傳和下載方法,代碼如下:
public static OkHttpClient okHttpClient;private static OkHttpUtils okHttpUtils = new OkHttpUtils();private OkHttpUtils(){}public static OkHttpUtils getOkHttpUtils(){okHttpClient = new OkHttpClient.Builder().callTimeout(5, TimeUnit.SECONDS).readTimeout(5,TimeUnit.SECONDS).build();return okHttpUtils;}public void get(String url, final CallBack callBack){Request request = new Request.Builder().get().url(url).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callBack.onError(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {callBack.onSuccess(response);}});}public void post(String url, HashMap<String,String> map, final CallBack callBack){Set<Map.Entry<String, String>> entries = map.entrySet();FormBody.Builder builder = new FormBody.Builder();for (Map.Entry<String, String> entrie : entries) {String key = entrie.getKey();String value = entrie.getValue();builder.add(key,value);}FormBody formBody = builder.build();Request request = new Request.Builder().post(formBody).url(url).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callBack.onError(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {callBack.onSuccess(response);}});}OkHttp攔截器
主要用于攔截發送信息
public static OkHttpClient okHttpClient;private static OkHttpUtils okHttpUtils = new OkHttpUtils();private OkHttpUtils(){}public static OkHttpUtils getOkHttpUtils(){okHttpClient = new OkHttpClient.Builder().callTimeout(5, TimeUnit.SECONDS).readTimeout(5,TimeUnit.SECONDS).addInterceptor(httpLoggingInterceptor).addInterceptor(interceptor).build();return okHttpUtils;}static HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {@Overridepublic void log(String message) {Log.d("###",message);}});static Interceptor interceptor = new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request().newBuilder().header("token", "token").build();return chain.proceed(request);}};SpringBoot——集成Okhttp3
1.pom依賴:
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.10.0</version> </dependency>2.okhttp工具類:
public class OkHttpUtils {private static volatile OkHttpClient okHttpClient = null;private static volatile Semaphore semaphore = null;private Map<String, String> headerMap;private Map<String, String> paramMap;private String url;private Request.Builder request;/*** 初始化okHttpClient,并且允許https訪問*/private OkHttpUtils() {if (okHttpClient == null) {synchronized (OkHttpUtils.class) {if (okHttpClient == null) {TrustManager[] trustManagers = buildTrustManagers();okHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0]).hostnameVerifier((hostName, session) -> true).retryOnConnectionFailure(true).build();addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");}}}}/*** 用于異步請求時,控制訪問線程數,返回結果** @return*/private static Semaphore getSemaphoreInstance() {//只能1個線程同時訪問synchronized (OkHttpUtils.class) {if (semaphore == null) {semaphore = new Semaphore(0);}}return semaphore;}/*** 創建OkHttpUtils** @return*/public static OkHttpUtils builder() {return new OkHttpUtils();}/*** 添加url** @param url* @return*/public OkHttpUtils url(String url) {this.url = url;return this;}/*** 添加參數** @param key 參數名* @param value 參數值* @return*/public OkHttpUtils addParam(String key, String value) {if (paramMap == null) {paramMap = new LinkedHashMap<>(16);}paramMap.put(key, value);return this;}/*** 添加請求頭** @param key 參數名* @param value 參數值* @return*/public OkHttpUtils addHeader(String key, String value) {if (headerMap == null) {headerMap = new LinkedHashMap<>(16);}headerMap.put(key, value);return this;}/*** 初始化get方法** @return*/public OkHttpUtils get() {request = new Request.Builder().get();StringBuilder urlBuilder = new StringBuilder(url);if (paramMap != null) {urlBuilder.append("?");try {for (Map.Entry<String, String> entry : paramMap.entrySet()) {urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8")).append("&");}} catch (Exception e) {e.printStackTrace();}urlBuilder.deleteCharAt(urlBuilder.length() - 1);}request.url(urlBuilder.toString());return this;}/*** 初始化post方法** @param isJsonPost true等于json的方式提交數據,類似postman里post方法的raw* false等于普通的表單提交* @return*/public OkHttpUtils post(boolean isJsonPost) {RequestBody requestBody;if (isJsonPost) {String json = "";if (paramMap != null) {json = JSON.toJSONString(paramMap);}requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);} else {FormBody.Builder formBody = new FormBody.Builder();if (paramMap != null) {paramMap.forEach(formBody::add);}requestBody = formBody.build();}request = new Request.Builder().post(requestBody).url(url);return this;}/*** 同步請求** @return*/public String sync() {setHeader(request);try {Response response = okHttpClient.newCall(request.build()).execute();assert response.body() != null;return response.body().string();} catch (IOException e) {e.printStackTrace();return "請求失敗:" + e.getMessage();}}/*** 異步請求,有返回值*/public String async() {StringBuilder buffer = new StringBuilder("");setHeader(request);okHttpClient.newCall(request.build()).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {buffer.append("請求出錯:").append(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {assert response.body() != null;buffer.append(response.body().string());getSemaphoreInstance().release();}});try {getSemaphoreInstance().acquire();} catch (InterruptedException e) {e.printStackTrace();}return buffer.toString();}/*** 異步請求,帶有接口回調** @param callBack*/public void async(ICallBack callBack) {setHeader(request);okHttpClient.newCall(request.build()).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callBack.onFailure(call, e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {assert response.body() != null;callBack.onSuccessful(call, response.body().string());}});}/*** 為request添加請求頭** @param request*/private void setHeader(Request.Builder request) {if (headerMap != null) {try {for (Map.Entry<String, String> entry : headerMap.entrySet()) {request.addHeader(entry.getKey(), entry.getValue());}} catch (Exception e) {e.printStackTrace();}}}/*** 生成安全套接字工廠,用于https請求的證書跳過** @return*/private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {SSLSocketFactory ssfFactory = null;try {SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, new SecureRandom());ssfFactory = sc.getSocketFactory();} catch (Exception e) {e.printStackTrace();}return ssfFactory;}private static TrustManager[] buildTrustManagers() {return new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}};}/*** 自定義一個接口回調*/public interface ICallBack {void onSuccessful(Call call, String data);void onFailure(Call call, String errorMsg);} }3.測試
@SpringBootTest class SpringBootOkhttp3ApplicationTests {@Testvoid contextLoads() {// get請求,方法順序按照這種方式,切記選擇post/get一定要放在倒數第二,同步或者異步倒數第一,才會正確執行OkHttpUtils.builder().url("請求地址,http/https都可以")// 有參數的話添加參數,可多個.addParam("參數名", "參數值").addParam("參數名", "參數值")// 也可以添加多個.addHeader("Content-Type", "application/json; charset=utf-8").get()// 可選擇是同步請求還是異步請求//.async();.sync();System.out.println("----------------------------------");// post請求,分為兩種,一種是普通表單提交,一種是json提交OkHttpUtils.builder().url("請求地址,http/https都可以")// 有參數的話添加參數,可多個.addParam("參數名", "參數值").addParam("參數名", "參數值")// 也可以添加多個.addHeader("Content-Type", "application/json; charset=utf-8")// 如果是true的話,會類似于postman中post提交方式的raw,用json的方式提交,不是表單// 如果是false的話傳統的表單提交.post(true).sync();// 選擇異步有兩個方法,一個是帶回調接口,一個是直接返回結果OkHttpUtils.builder().url("").post(false).async();OkHttpUtils.builder().url("").post(false).async(new OkHttpUtils.ICallBack() {@Overridepublic void onSuccessful(Call call, String data) {// 請求成功后的處理}@Overridepublic void onFailure(Call call, String errorMsg) {// 請求失敗后的處理}});} }總結
以上是生活随笔為你收集整理的OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5和前端精要(4)-头部信息
- 下一篇: 工业用微型计算机(15)-指令系统(10