PS:踏踏實實走好每一步...java
學習內容:android
1.使用AndBase框架實現無參Http Get請求...安全
2.使用AndBase框架實現有參Http Post請求...服務器
3.使用AndBase框架實現有參Http Get請求...網絡
AndBase框架爲咱們提供了一些相關的方法提供給咱們使用,用來完成Http網絡請求...整體就是對Http請求的一個封裝,不過我的認爲,網絡請求這一模塊更加推薦使用Volley框架..樓主對比了兩個框架中的源碼...Volley更多的地方是使用抽象方法封裝在接口內,而後對外暴露接口,其餘類在實現接口的同時須要實現內部的抽象方法...而AndBase則是使用繼承的方式..繼承父類..實現類經過重寫的方式對封裝的方法重寫從而進行下一步的操做...app
相比兩者網絡請求的源碼,Volley源碼的書寫仍是更勝一籌...Volley是Google推出的,針對的也僅僅是網絡請求這一模塊...一樣AndBase也是很是優秀的,是國內牛人寫的一款重量級框架,涉及的模塊很是的普遍,仍是很是好用的...框架
1.使用AndBase框架實現無參Http Get請求...jsp
通常普通的網絡請求若是不涉及到數據信息的變化,也就是不涉及一些安全性問題,均可以使用Get方式來完成網絡請求...Get請求也是分爲有參和無參的,給個人感受有參通常能夠用於向服務器上傳資源數據...先介紹一下無參的Get請求...仍是先從源碼的地方來看看...
ide
源碼的調用方式是先使用AbHttpUtils.get()函數調用...不過這可有可無...經過這個方法走向AbHttpClient類內部...執行下面這段源碼...不管是有參仍是無參..都會調用這個方法..無參的時候第二個參數傳遞null就好了...
函數
public void get(final String url,final AbRequestParams params,final AbHttpResponseListener responseListener) { responseListener.setHandler(new ResponderHandler(responseListener)); executorService.submit(new Runnable() { public void run() { try { doGet(url,params,responseListener); } catch (Exception e) { e.printStackTrace(); } } }); }
咱們能夠看到,這段函數首先經過Handler發送Message...同時開啓一個線程池,來提交當前的請求...最後將執行doGet()方法...同時Handler一直對responseListener的消息進行處理..doGet()方法的源碼過程以下...
private void doGet(String url,AbRequestParams params,AbHttpResponseListener responseListener){ try { responseListener.sendStartMessage(); if(!debug && !AbAppUtil.isNetworkAvailable(mContext)){ responseListener.sendFailureMessage(AbConstant.CONNECT_FAILURE_CODE,AbConstant.CONNECTEXCEPTION, new AbAppException(AbConstant.CONNECTEXCEPTION)); return; } //HttpGet鏈接對象 if(params!=null){ url += params.getParamString(); //若是有參,那麼獲取相關參數... } HttpGet httpRequest = new HttpGet(url); //定義鏈接對象.. BasicHttpParams httpParams = new BasicHttpParams(); // 從鏈接池中取鏈接的超時時間,設置爲1秒 ConnManagerParams.setTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT); ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(DEFAULT_MAX_CONNECTIONS)); ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS); // 讀響應數據的超時時間 HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT); HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT); HttpConnectionParams.setTcpNoDelay(httpParams, true); HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE); //設置協議版本... HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1); HttpProtocolParams.setUserAgent(httpParams, String.format("andbase-http/%s (http://www.418log.org/)", 1.0)); // 設置請求參數 httpRequest.setParams(httpParams); //取得HttpClient對象 HttpClient httpClient = new DefaultHttpClient(); //請求HttpClient,取得HttpResponse HttpResponse httpResponse = httpClient.execute(httpRequest); //請求成功 int statusCode = httpResponse.getStatusLine().getStatusCode(); //取得返回的字符串 HttpEntity mHttpEntity = httpResponse.getEntity(); if (statusCode == HttpStatus.SC_OK){ if(responseListener instanceof AbStringHttpResponseListener){ String content = EntityUtils.toString(mHttpEntity); ((AbStringHttpResponseListener)responseListener).sendSuccessMessage(statusCode, content); }else if(responseListener instanceof AbBinaryHttpResponseListener){ readResponseData(mHttpEntity,((AbBinaryHttpResponseListener)responseListener)); }else if(responseListener instanceof AbFileHttpResponseListener){ //獲取文件名 String fileName = AbFileUtil.getFileNameFromUrl(url, httpResponse); writeResponseData(mHttpEntity,fileName,((AbFileHttpResponseListener)responseListener)); } }else{ String content = EntityUtils.toString(mHttpEntity); responseListener.sendFailureMessage(statusCode, content, new AbAppException(AbConstant.UNKNOWNHOSTEXCEPTION)); } } catch (Exception e) { e.printStackTrace(); //發送失敗消息 responseListener.sendFailureMessage(AbConstant.UNTREATED_CODE,e.getMessage(),new AbAppException(e)); }finally{ responseListener.sendFinishMessage(); } }
有了上面的源碼調用過程其實就很是的清晰了..
不管是doGet()方法仍是doPost()方法模式基本是相同的,都是須要先創建一個鏈接對象,HttpGet或HttpPost..不一樣之處在於有參的Get請求直接將params加入到url後面便可,而Post請求須要獲取實體數據..在實體數據中加入咱們傳遞的params..設置鏈接過程和讀取數據過程當中的相關參數,好比說超時的時間,使用的Http版本,設置UserAgent等等...設置完以後執行請求獲取響應了...
中間涉及到了一個判斷的過程..判斷返回的響應數據到底屬於什麼類型的數據,是基本的String類型,仍是與圖片或者視頻相關的Byte類型,仍是與文件相關的File類型...經過對相關類型的判斷,執行不一樣的方法,雖然方法不相同,可是最後的目的是同樣的,都是把實體數據進行封裝...封裝完畢後調用sendSuccessMessage而後Handler自動回去處理Message...最後調用OnSuccess方法..將數據返回給客戶端..
仍是看一下實際的調用過程...
無參的Get請求調度...這裏須要設置相應監聽...
public void FileClick(View v){ url="http://192.168.199.172:8080/JSP/imageview.jpg"; getView(); httpUtil.get(url, new FileResponseListener(this, this, v,max_tv,num_tv,progressBar)); }
GetResponseListener.java
對響應的監聽的一個重寫過程...經過爲請求設置上url+相關監聽就可以完成網絡請求,並對請求數據進行相關處理了...這裏完成了一個圖片數據的下載,而後經過對數據進行封裝,就成了一個Bitmap..這樣就可以在控件上進行顯示了..
package com.example.andbasehttp; import java.io.File; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.graphics.Bitmap; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.ab.activity.AbActivity; import com.ab.http.AbFileHttpResponseListener; import com.ab.util.AbFileUtil; import com.ab.view.progress.AbHorizontalProgressBar; public class FileResponseListener extends AbFileHttpResponseListener{ private int max=100; private int progress=0; private AbActivity activity; private Context context; private AlertDialog dialog; private View view; private TextView max_tv,num_tv; private AbHorizontalProgressBar progressBar; public FileResponseListener(AbActivity activity,Context context,View v,TextView v1,TextView v2, AbHorizontalProgressBar progressBar ){ this.activity=activity; this.context=context; this.view=v; this.max_tv=v1; this.num_tv=v2; this.progressBar=progressBar; } @Override public void onSuccess(int statusCode, File file){ Bitmap bitmap=AbFileUtil.getBitmapFromSD(file); ImageView view=new ImageView(context); view.setImageBitmap(bitmap); activity.showDialog("返回結果", view, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); } @Override public void onFailure(int statusCode, String content,Throwable error){ activity.showToast(error.toString()); } @Override public void onStart(){ max_tv.setText(progress+"/"+String.valueOf(max)); progressBar.setMax(max); progressBar.setProgress(progress); dialog=activity.showDialog("正在下載", view); } @Override public void onProgress(int bytesWritten, int totalSize){ max_tv.setText(bytesWritten/(totalSize/max)+"/"+max); progressBar.setProgress(bytesWritten/(totalSize/max)); } @Override public void onFinish(){ dialog.cancel(); dialog=null; } }
2.使用AndBase框架實現有參Http Post請求...
其實調用的方式都是相同的,,只不過Post請求須要傳遞相關的參數...使用有參的Post請求...這裏是向一個JSP傳遞相關參數來完成數據信息的驗證...
public void PostClick(View v){ url="http://192.168.199.172:8080/JSP/post.jsp"; params=new AbRequestParams(); params.put("name", "darker"); params.put("password", "49681888"); httpUtil.post(url, params, new PostResponseListener(this)); }
這裏我就不粘貼PostResponseListener的代碼了...貼一下JSP頁面的代碼..相關的JSP代碼以下...這裏的JSP代碼很是的簡單..而且前面在使用Volley的時候也使用過..JSP頁面咱們徹底能夠本身書寫的更加複雜一些,那麼就可以實現更多的功能...
<% String name=request.getParameter("name"); String password=request.getParameter("password"); if("darker".equals(name)&& "49681888".equals(password)){ out.println("Receive name is:"+name); out.println("Receive password is:"+password);%> Your Message are right! <%}else{ out.println("Receive name is:"+name); out.println("Receive password is:"+password);%> Your Message are wrong! <%}%>
3.使用AndBase框架實現有參Http Get請求...
有參的Get請求通常用於文件,數據資源的上傳...將上傳的資源以及名稱做爲參數傳遞給服務器..這裏不涉及安全上的問題..所以可使用帶有參數的Get請求...這裏向服務器上傳文件..須要添加相關參數...
public void FileLoadClick(View v){ url="http://192.168.199.172:8080"; AbRequestParams params = new AbRequestParams(); File pathRoot = Environment.getExternalStorageDirectory(); String path = pathRoot.getAbsolutePath(); File file1 = new File(path+"/download/cache_files/aa.txt"); params.put(file1.getName(),file1); getView(); httpUtil.get(url, params, new FileSendResponseListener(this, this, v, max_tv, num_tv, progressBar)); }
這裏的監聽事件簡單的粘貼一下...監聽事件之因此傳遞控件..是爲了更好的向用戶進行展現...這裏設置了一個進度條的方式,來貫穿整個請求——響應的過程...若是下載或者是上傳的文件和資源過多...咱們是必須通知用戶相關進度的..總不能一直卡死在界面上..這樣用戶也沒法知道究竟是否完成了數據的上傳或者是下載...
package com.example.andbasehttp; import android.app.AlertDialog; import android.content.Context; import android.view.View; import android.widget.TextView; import com.ab.activity.AbActivity; import com.ab.http.AbStringHttpResponseListener; import com.ab.view.progress.AbHorizontalProgressBar; public class FileSendResponseListener extends AbStringHttpResponseListener{ private int max=100; private int progress=0; private AbActivity activity; private Context context; private AlertDialog dialog; private View view; private TextView max_tv,num_tv; private AbHorizontalProgressBar progressBar; public FileSendResponseListener(AbActivity activity,Context context,View v,TextView v1,TextView v2, AbHorizontalProgressBar progressBar ){ this.activity=activity; this.context=context; this.view=v; this.max_tv=v1; this.num_tv=v2; this.progressBar=progressBar; } @Override public void onSuccess(int statusCode, String content){ activity.showToast("OnSuccess"); System.out.println(content); } @Override public void onFailure(int statusCode, String content,Throwable error){ activity.showToast(error.toString()); } @Override public void onStart(){ max_tv.setText(progress+"/"+String.valueOf(max)); progressBar.setMax(max); progressBar.setProgress(progress); activity.showToast("正在下載"); dialog=activity.showDialog("正在下載", view); } @Override public void onProgress(int bytesWritten, int totalSize){ max_tv.setText(bytesWritten/(totalSize/max)+"/"+max); progressBar.setProgress(bytesWritten/(totalSize/max)); } @Override public void onFinish(){ dialog.cancel(); dialog=null; } }
涉及到的類爲com.ab.http保內的全部類...
1.AbStringHttpResponseListener.java
2.AbBinaryHttpResponseListener.java
3.AbFileHttpResponseListener.java
這三個類是對AbHttpResponseListener.java的一個繼承...繼承了其內部的一些相關方法..包括請求開始,結束,失敗等等函數...
AbHttpClient.java就是用來完成請求——鏈接過程的實現...其中還包含數據的封裝..
AbHttpUtils.java則是對post,get等方法調用的一箇中間層...
AbRequestParams.java 則是對請求參數處理的一個類...不只包含對請求參數的處理,還包含對實體的建立..爲實體添加相關參數等方法的實現過程...