版權聲明:本文為HaiyuKing原創文章,轉載請注明出處!
上一篇講了如何在項目中導入OKHttputils庫的操作,這一篇主要講常見請求的寫法。
get請求
public String getPersionTypeApi(StringCallback callback) throws Exception { String result = ""; OkHttpUtils .get() .url(getSpcyUrl(ServerApi.GET_PERSION_TYPE_URL)) .addParams("IS_JSON", "true") .addParams("VALUE_OBJES_4_JSON", "jsonMap") .id(100) .tag(context) .build() .execute(callback); return result; }
調用
private void getPersionType(){ try { LoginLogic.Instance(MainActivity.this).getPersionTypeApi(new GetPersionTypeStringCallback()); } catch (Exception e) { e.printStackTrace(); } }
回調
public class GetPersionTypeStringCallback extends StringCallback { @Override public void onBefore(Request request, int id) {//showProgressDialog("");//顯示進度加載框 } @Override public void onAfter(int id) {//dismissProgressDialog();//隱藏進度加載框 } @Override public void onError(Call call, Exception e, int id) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_again)); Log.w(TAG,"{onError}e="+e.toString()); } @Override public void onResponse(String response, int id) { Log.e(TAG, "onResponse:response="+response); switch (id) { case 100://http try { if (response != null && !"".equals(response)){ //解析 } else { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_null_exception)); } } catch (JSONException e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); }catch (Exception e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); } finally { } break; case 101://https break; } } @Override public void inProgress(float progress, long total, int id) { Log.e(TAG, "inProgress:" + progress); } }
Post請求
public String LoginApi(String userName, String password,StringCallback callback) throws Exception { String result = ""; OkHttpUtils .post() .url(getSpcyUrl(ServerApi.LOGIN_URL)) .addParams("user.userName", userName) .addParams("user.password", password) .addParams("IS_JSON", "true") .addParams("loginModel", "mobile") .addParams("VALUE_OBJES_4_JSON", "loginUser") .addParams("userLoginModel", "mobile") .id(100) .tag(context) .build() .execute(callback); return result; }
調用
private void Login(){ String userName = "xxx"; String passWord = "sssxxxccccvvfddfggfgfg"; try { LoginLogic.Instance(MainActivity.this).LoginApi(userName, passWord, new LoginStringCallback()); } catch (Exception e) { e.printStackTrace(); } }
回調
public class LoginStringCallback extends StringCallback { @Override public void onBefore(Request request, int id) {//showProgressDialog("");//顯示進度加載框 } @Override public void onAfter(int id) {//dismissProgressDialog();//隱藏進度加載框 } @Override public void onError(Call call, Exception e, int id) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_again)); Log.w(TAG,"{onError}e="+e.toString()); } @Override public void onResponse(String response, int id) { Log.e(TAG, "onResponse:response="+response); switch (id) { case 100://http try { if (response != null && !"".equals(response)){ //解析登錄成功信息 JSONObject responseObj = new JSONObject(response); } else { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_null_exception)); } } catch (JSONException e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); }catch (Exception e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); } finally { } break; case 101://https break; } } @Override public void inProgress(float progress, long total, int id) { Log.e(TAG, "inProgress:" + progress); } }
postString【Json數據】請求
public String postJsonApi(PostJsonModel postJsonModel, StringCallback callback){ String result = ""; OkHttpUtils .postString() .url(getSpcyUrl(ServerApi.POSTJSON_URL)) .content(new Gson().toJson(postJsonModel)) .mediaType(MediaType.parse("application/json; charset=utf-8")) .id(100) .tag(context) .build() .execute(callback); return result; }

package com.why.project.okhttputilsdemo.model; /** * Created by HaiyuKing * Used */ public class PostJsonModel { private String title = ""; private String tic = ""; private String type = ""; public String getTic() { return tic; } public void setTic(String tic) { this.tic = tic; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
調用、回調【跟post、get請求的回調寫法類似】
post提交文件請求
public String postFileApi(File file, StringCallback callback){ String result = ""; OkHttpUtils .postFile() .url(getSpcyUrl(ServerApi.POSTFILE_URL)) .file(file) .id(100) .tag(context) .build() .execute(callback); return result; }
調用、回調【跟post、get請求的回調寫法類似】
上傳單個文件請求
/** * 單個文件上傳接口 */ public String upLoadFileApi(String checktaskId, String clauseId, String checkClauseId, String filepath, String filename,StringCallback callback){ String result = ""; OkHttpUtils .post() .url(getSpcyUrl(ServerApi.UPLOAD_FILE_URL)) .addFile("uploadUtil.file", filename, new File(filepath)) .addParams("jcCheckTaskId", checktaskId) .addParams("clId", clauseId) .addParams("uploadUtil.checkClauseId", checkClauseId) .id(100) .tag(context) .build() .execute(callback); return result; }
調用
private void upLoadFile(String filePath, String fileName){ String checktaskId = "402881ca5d2b3f5c015d2b40da3a0002"; String clauseId = "402881ca5d2b3f5c015d2b40dec30216"; String checkClauseId = "40288188587234fe015872e256a300ab"; LoginLogic.Instance(MainActivity.this).upLoadFileApi(checktaskId, clauseId, checkClauseId, filePath, fileName, new UpLoadFileStringCallback()); }
回調
public class UpLoadFileStringCallback extends StringCallback { public UpLoadFileStringCallback(){ } @Override public void onBefore(Request request, int id) {//showProgressDialogUpload("");//顯示加載對話框 } @Override public void onAfter(int id) {//dismissProgressDialog();//隱藏進度加載框 } @Override public void onError(Call call, Exception e, int id) {ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_again)); } @Override public void onResponse(String response, int id) { Log.e(TAG, "onResponse:response="+response); switch (id) { case 100://http try { if (response != null && !"".equals(response)){ // JSONObject object = new JSONObject(response); if(object.has("result") && object.getString("result").equals("上傳成功")){ ToastUtil.showShortToastCenter("上傳成功"); }else{ ToastUtil.showShortToastCenter("上傳失敗,請重試!"); } } else { ToastUtil.showShortToastCenter("上傳失敗,請重試!"); } }catch (JSONException e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); }catch (Exception e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); } finally { } break; case 101://https break; } } @Override public void inProgress(float progress, long total, int id) { Log.e(TAG, "inProgress:" + progress);//inProgress:0.99884826 tv_result.setText("正在上傳:" + (int)(progress * 100)+"%");//模擬顯示進度值 //ProgressWheelDialogUtil.setDialogMsg((int)(progress * 100)+"%");//更改上傳進度提示框的進度值 } }
上傳多個文件的請求
/** * 多個文件上傳接口 */ public String upLoadFilesApi(String checktaskId, String clauseId, String checkClauseId, List<UploadFilesModel> uploadFilesModelList, StringCallback callback){ String result = ""; HashMap<String, File> fileMap = new HashMap<String,File>(); for(int i=0;i<uploadFilesModelList.size();i++) { UploadFilesModel model = uploadFilesModelList.get(i); File file = new File(model.getFilePath()); fileMap.put(model.getFileName(), file); } OkHttpUtils .post() .url(getSpcyUrl(ServerApi.UPLOAD_FILE_URL)) .files("uploadUtil.file",fileMap) .addParams("jcCheckTaskId", checktaskId) .addParams("clId", clauseId) .addParams("uploadUtil.checkClauseId", checkClauseId) .id(100) .tag(context) .build() .execute(callback); return result; }

package com.why.project.okhttputilsdemo.model; /** * Created by HaiyuKing * Used 上傳多個文件的model類 */ public class UploadFilesModel { private String filePath; private String fileName; public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } }
調用
private void upLoadFiles(List<UploadFilesModel> uploadFilesModelList){ String checktaskId = "402881ca5d2b3f5c015d2b40da3a0002"; String clauseId = "402881ca5d2b3f5c015d2b40dec30216"; String checkClauseId = "40288188587234fe015872e256a300ab"; LoginLogic.Instance(MainActivity.this).upLoadFilesApi(checktaskId, clauseId, checkClauseId, uploadFilesModelList, new UpLoadFilesStringCallback()); }
回調
/** * 文件上傳接口的自定義回調函數*/ public class UpLoadFilesStringCallback extends StringCallback { public UpLoadFilesStringCallback(){ } @Override public void onBefore(Request request, int id) {//showProgressDialogUpload("");//顯示加載對話框 } @Override public void onAfter(int id) {//dismissProgressDialog();//隱藏進度加載框 } @Override public void onError(Call call, Exception e, int id) {ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_again)); } @Override public void onResponse(String response, int id) { Log.e(TAG, "onResponse:response="+response); switch (id) { case 100://http try { if (response != null && !"".equals(response)){ // JSONObject object = new JSONObject(response); if(object.has("result") && object.getString("result").equals("上傳成功")){ ToastUtil.showShortToastCenter("上傳成功"); }else{ ToastUtil.showShortToastCenter("上傳失敗,請重試!"); } } else { ToastUtil.showShortToastCenter("上傳失敗,請重試!"); } }catch (JSONException e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); }catch (Exception e) { ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.login_json_exception)); } finally { } break; case 101://https break; } } @Override public void inProgress(float progress, long total, int id) { Log.e(TAG, "inProgress:" + progress);//inProgress:0.99884826 tv_result.setText("正在上傳:" + (int)(progress * 100)+"%");//模擬顯示進度值 //ProgressWheelDialogUtil.setDialogMsg((int)(progress * 100)+"%");//更改上傳進度提示框的進度值 } }
下載文件請求【返回的下載值為文件大小】
/** * 文件下載接口【返回的下載值為文件大小】 */ public String downloadFileApi(String fileid, FileCallBack callback){ String result = ""; OkHttpUtils .get() .url(getSpcyUrl(ServerApi.DOWNLOAD_FILE_URL)) .addParams("fileid", fileid) .id(100) .tag(context) .build() .execute(callback); return result; }
調用
private void downloadFile(){ String fileSavepath = Environment.getExternalStorageDirectory().toString() + File.separator + "Download";//文件保存路徑 String fileName = "download.jpg";//文件名稱【應該動態獲取,此處測試,所以寫死即可】 String fileSize = "1.33MB";//文件大小,單位為KB、MB等【應該動態獲取,此處測試,所以寫死即可】 String fileid = "402881ca5d2b3f5c015d2b4466d50284"; LoginLogic.Instance(MainActivity.this).downloadFileApi(fileid, new DownLoadFileCallBack(fileSavepath, fileName,fileSize)); }
回調
/** * 文件下載接口的自定義回調函數*/ public class DownLoadFileCallBack extends FileCallBack { String fileSavepath = ""; String filename = ""; String fileSize = ""; float fileSizeNum = 0.0f; /** * @param destFileDir * @param destFileName */ public DownLoadFileCallBack(String destFileDir,String destFileName,String fileSize) { super(destFileDir, destFileName); this.fileSavepath = destFileDir; this.filename = destFileName; this.fileSize = fileSize; fileSizeNum = Float.parseFloat(fileSize.substring(0, fileSize.length() - 2)); } @Override public void onBefore(Request request, int id) {//showProgressDialogUpload("");//顯示加載對話框 } @Override public void onAfter(int id) {//dismissProgressDialog();//隱藏進度加載框 } @Override public void inProgress(float progress, long total, int id) { Log.w(TAG,"{inProgress}progress="+progress);//情況一:顯示下載的文件大小,單位是B -1235527.0 float progressABS = Math.abs(progress);//取正 DecimalFormat df = new DecimalFormat("#.##"); double progressKB = progressABS / 1024.0D;//獲取KB值 if (fileSize.contains("MB")) progressABS = Float.parseFloat(df.format(progressKB / 1024.0D));//獲取MB值 else progressABS = Float.parseFloat(df.format(progressKB)); Log.e(TAG,"progressABS:" + progressABS); Log.e(TAG,"progressABS/fileSizeNum== :" + progressABS/fileSizeNum); tv_result.setText("下載進度:" + (int)(progressABS/fileSizeNum * 100)+"%"); } @Override public void onError(Call call, Exception e, int id) { ToastUtil.showShortToast("下載失敗"); } @Override public void onResponse(File file, int id) { Log.e(TAG, "onResponse :" + file.getAbsolutePath()); ToastUtil.showShortToast("下載成功"); } }
下載文件請求【返回的下載值為文件下載的比例值】
/** * 文件下載接口【返回的下載值為文件下載的比例值】 */ public String downloadFile2Api(FileCallBack callback){ String result = ""; OkHttpUtils .get() .url("http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk") .id(100) .tag(context) .build() .execute(callback); return result; }
調用
private void downloadFile2(){ String fileSavepath = Environment.getExternalStorageDirectory().toString() + File.separator + "Download";//文件保存路徑 String fileName = "MobileAssistant_1.apk";//文件名稱【應該動態獲取,此處測試,所以寫死即可】 LoginLogic.Instance(MainActivity.this).downloadFile2Api(new DownLoadFile2CallBack(fileSavepath, fileName)); }
回調
/** * 文件下載接口的自定義回調函數*/ public class DownLoadFile2CallBack extends FileCallBack { String fileSavepath = ""; String filename = ""; /** * @param destFileDir * @param destFileName */ public DownLoadFile2CallBack(String destFileDir, String destFileName) { super(destFileDir, destFileName); this.fileSavepath = destFileDir; this.filename = destFileName; } @Override public void onBefore(Request request, int id) {//showProgressDialogUpload("");//顯示加載對話框 } @Override public void onAfter(int id) {//dismissProgressDialog();//隱藏進度加載框 } @Override public void inProgress(float progress, long total, int id) { Log.w(TAG,"{inProgress}progress="+progress);//情況一:下載進度值為文件的下載比例值 0.4827961 float progress1 = Math.abs(progress); tv_result.setText("下載進度:" + (int)(progress1 * 100)+"%"); } @Override public void onError(Call call, Exception e, int id) { ToastUtil.showShortToast("下載失敗"); } @Override public void onResponse(File file, int id) { Log.e(TAG, "onResponse :" + file.getAbsolutePath()); ToastUtil.showShortToast("下載成功"); } }
同步請求【需要在子線程中執行】
/** * 模擬同步請求--注銷*/ public String LogoutApi() throws IOException { String result = ""; //同步請求--用於在自定義的thread中執行 Response response = OkHttpUtils .post() .url(getSpcyUrl(ServerApi.LOGOUT_URL)) .addParams("IS_JSON", "true") .id(100) .tag(context) .build() .execute(); //execute方法不傳入callback即為同步的請求,返回Response對象,需要自己解析 InputStream responseIs = response.body().byteStream(); BufferedReader responseBufferedReader = new BufferedReader(new InputStreamReader(responseIs, "utf-8")); StringBuilder responseStringBuilder = new StringBuilder(); while (true) { String readLine = responseBufferedReader.readLine(); if (readLine == null) { break; } responseStringBuilder.append(readLine); } responseIs.close(); result = responseStringBuilder.toString(); return result; }
調用
//模擬同步請求--注銷 btn_synchronize.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { try { String logoutStr = LoginLogic.Instance(MainActivity.this).Logout(); Message msg = new Message(); msg.what = TOAST_SHOW; msg.obj = logoutStr; mHandler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } } }).start(); } });
/**用於toast提示*/ private static final int TOAST_SHOW = 18; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case TOAST_SHOW: ToastUtil.showShortToast((String)msg.obj); tv_result.setText((String)msg.obj); break; } } };
單個請求添加cookie
/** * 獲取接口 */ public String getNewsApi(StringCallback callback) throws Exception { String result = ""; String SESSION_SERVER_HEAD = "JSESSIONID="; String SESSION_SERVER_ID = "9B17276F7C0CA4F309ABA0C93D87A3F8"; OkHttpUtils .get() .url(getSpcyUrl(context.getString(R.string.get_news_url))) .addHeader("Cookie",SESSION_SERVER_HEAD + SESSION_SERVER_ID) .id(100) .tag(context) .build() .execute(callback); return result; }
獲取cookies【用於保存到SharedPreferences中】
/**獲取cookies*/ public static String getCookiesStr(){ String cookiesInfo = ""; CookieJar cookieJar = OkHttpUtils.getInstance().getOkHttpClient().cookieJar(); if (cookieJar instanceof CookieJarImpl) { CookieStore cookieStore = ((CookieJarImpl) cookieJar).getCookieStore(); List<Cookie> cookies = cookieStore.getCookies(); for(Cookie cookie : cookies){ cookiesInfo = cookiesInfo + cookie.name() + ":" + cookie.value() + ";"; } } return cookiesInfo; }
清空cookies
/**清空cookie緩存*/ public static void clearCookies() { CookieJar cookieJar = OkHttpUtils.getInstance().getOkHttpClient().cookieJar(); if (cookieJar instanceof CookieJarImpl) { ((CookieJarImpl) cookieJar).getCookieStore().removeAll(); } //需要清空webview中的cookie,https://www.cnblogs.com/umpjls/p/7319177.html CookieManager webViewCookieManager = CookieManager.getInstance(); webViewCookieManager.removeAllCookie(); }
webview異步cookies
/** * Sync Cookie */ public static void syncCookie(Context context, String url){ try{ LogUtil.d("Nat: webView.syncCookie.url", url); String sessionId = ""; String loginmodel = "normal";//默認值是normal String domain = ServerApi.SERVER_URL_COOKIE;//默認值為域名(不含有http) String path = "/";//默認值為/ //獲取保存的cookie信息 String savedCookie = PreferencesUtils.getString(context,PreferencesUtils.COOKEY,"");//JSESSIONID:9B17276F7C0CA4F309ABA0C93D87A3F8; LogUtil.e(TAG,"savedCookie="+savedCookie); if(!TextUtils.isEmpty(savedCookie)){ String[] cookies = savedCookie.split(";"); for(int i=0;i<cookies.length;i++){ if(!TextUtils.isEmpty(cookies[i].trim())){ if(cookies[i].trim().contains("JSESSIONID")){ String[] cookie = cookies[i].split(":"); sessionId = cookie[1].trim(); } if(cookies[i].trim().contains("loginmodel")){ String[] cookie = cookies[i].split(":"); loginmodel = cookie[1].trim(); } } } LogUtil.d(TAG, "sessionId="+sessionId); LogUtil.d(TAG, "path="+path); //方式一【沒有起作用】 /*CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie();// 移除 cookieManager.removeAllCookie(); CookieSyncManager.getInstance().sync(); String oldCookie = cookieManager.getCookie(url); if(oldCookie != null){ LogUtil.d("Nat: webView.syncCookieOutter.oldCookie", oldCookie); } StringBuilder sbCookie = new StringBuilder(); sbCookie.append(String.format("JSESSIONID=%s",sessionId)); //ip地址的話應該是不需要設置的,只有在域名的情況下才可以設置 sbCookie.append(String.format(";domain=%s", domain)); sbCookie.append(String.format(";loginmodel=%s",loginmodel)); sbCookie.append(String.format(";path=%s",path)); String cookieValue = sbCookie.toString(); cookieManager.setCookie(url,cookieValue); LogUtil.e(TAG,"cookieValue="+cookieValue); CookieSyncManager.getInstance().sync();*/ //方式二 CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie();//移除 cookieManager.removeAllCookie();//移除 CookieSyncManager.getInstance().sync(); cookieManager.setCookie(url, String.format("JSESSIONID=%s",sessionId));// cookieManager.setCookie(url, String.format("Domain=%s", domain));// cookieManager.setCookie(url, String.format("Path=%s",path));// cookieManager.setCookie(url, String.format("loginmodel=%s",loginmodel));// CookieSyncManager.getInstance().sync(); String newCookie = cookieManager.getCookie(url); if(newCookie != null){ LogUtil.d("Nat: webView.syncCookie.newCookie", newCookie);// } } }catch(Exception e){ LogUtil.e("Nat: webView.syncCookie failed", e.toString()); } }
配置HTTPS請求
/** * 配置OkhttpClient */ private void initOkHttp() { CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));//修改成自帶的cookie持久化,可以解決程序崩潰時返回到 //ClearableCookieJar cookieJar1 = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationContext())); SSLContext sslContext = null; try { sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, new TrustManager[]{new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}, new SecureRandom()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);//設置可訪問所有的https網站 OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10000L, TimeUnit.MILLISECONDS) .readTimeout(10000L, TimeUnit.MILLISECONDS) //配置Log,通過設置攔截器實現,框架中提供了一個LoggerInterceptor,當然你可以自行實現一個Interceptor .addInterceptor(new LoggerInterceptor("TAG")) //配置持久化Cookie(包含Session) .cookieJar(cookieJar) .hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { // TODO Auto-generated method stub //return false; return true; } }) //配置Https .sslSocketFactory(sslContext.getSocketFactory()) .build(); OkHttpUtils.initClient(okHttpClient); }
設置UA【默認為okhttp/3.3】
OkHttpUtils.head().addHeader("User-Agent","mobile");//設置UA,默認為okHttp的版本okhttp/3.3.0
在MyApplication.java中的initOkHttp方法中最后一行添加。
單個請求設置超時時間
public String checkServerUrlApi(Context context,String time,StringCallback callback) throws Exception{ String result = ""; OkHttpUtils .get() .url(getSpcyUrl(context.getString(R.string.check_url))) .addParams("time", time) .id(100) .tag(context) .build() .connTimeOut(3000L) .readTimeOut(3000L) .execute(callback); return result; }