Android开发使用AndBase框架完成Http请求

AndBase框架为我们提供了一些相关的方法提供给我们使用,用来完成Http网络请求...总体就是对Http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用Volley框架..楼主对比了两个框架中的源码...Volley更多的地方是使用抽象方法封装在接口内,然后对外暴露接口,其他类在实现接口的同时需要实现内部的抽象方法...而AndBase则是使用继承的方式..继承父类..实现类通过重写的方式对封装的方法重写从而进行下一步的操作...

相比二者网络请求的源码,Volley源码的书写还是更胜一筹...Volley是Google推出的,针对的也仅仅是网络请求这一模块...同样AndBase也是非常优秀的,是国内牛人写的一款重量级框架,涉及的模块非常的广泛,还是非常好用的...

1.使用AndBase框架实现无参Http Get请求...

一般普通的网络请求如果不涉及到数据信息的变化,也就是不涉及一些安全性问题,都可以使用Get方式来完成网络请求...Get请求也是分为有参和无参的,给我的感觉有参一般可以用于向服务器上传资源数据...先介绍一下无参的Get请求...还是先从源码的地方来看看...

源码的调用方式是先使用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="yun_qi_img/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 则是对请求参数处理的一个类...不仅包含对请求参数的处理,还包含对实体的创建..为实体添加相关参数等方法的实现过程...

Android Http Get和Post请求

通过HttpGet和HttpPost向服务器提交请求,并从服务器返回结果信息。通过如下3步访问Http资源。

(1)创建HttpGet或者HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。
(2)使用DefaultHttpClient.execute方法发送Http Get或Http Post请求,并返回HttpResponse对象。
(3)通过HttpResponse.getEntity方法返回响应信息,并进行相应的处理。

如果使用HttpPost方法提交Http Post请求,还需要使用HttpPost.setEntity方法设置请求参数。

实例代码如下:

package mobile.android.ch13.httpgetpost;

import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Main extends Activity implements OnClickListener
{

    @Override
    public void onClick(View view)
    {
        String url = "http://172.22.20.194:8080/querybooks/QueryServlet";
        TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
        EditText etBookName = (EditText) findViewById(R.id.etBookName);
        HttpResponse httpResponse = null;
        try
        {
            
            switch (view.getId())
            {
                case R.id.btnGetQuery:
                    url += "?bookname=" + etBookName.getText().toString();
                    HttpGet httpGet = new HttpGet(url);
                    httpResponse = new DefaultHttpClient().execute(httpGet);
                    if (httpResponse.getStatusLine().getStatusCode() == 200)
                    {
                        
                        String result = EntityUtils.toString(httpResponse
                                .getEntity());
                        tvQueryResult.setText(result.replaceAll("\r", ""));
                    }
                    break;

                case R.id.btnPostQuery:
                    HttpPost httpPost = new HttpPost(url);
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("bookname", etBookName
                            .getText().toString()));
                    httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
                    
                    httpResponse = new DefaultHttpClient().execute(httpPost);
                    if (httpResponse.getStatusLine().getStatusCode() == 200)
                    {
                        String result = EntityUtils.toString(httpResponse
                                .getEntity());
                        tvQueryResult.setText(result.replaceAll("\r", ""));
                    }
                    break;
            }
        }
        catch (Exception e)
        {
            tvQueryResult.setText(e.getMessage());
        }

    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btnGetQuery = (Button) findViewById(R.id.btnGetQuery);
        Button btnPostQuery = (Button) findViewById(R.id.btnPostQuery);
        btnGetQuery.setOnClickListener(this);
        btnPostQuery.setOnClickListener(this);
        
    }
}

时间: 2024-09-17 19:11:54

Android开发使用AndBase框架完成Http请求的相关文章

Android开发中的几种网络请求方式详解_Android

Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看Android开发技巧总结中的Android单元测试的步骤一文. Java.NET包中的HttpURLConnection类 Get方式: // Get方式请求 public static void requestByGet() throws Exception { String path = "h

请求参数返回数据成功-android开发,网络中可以请求返回数据

问题描述 android开发,网络中可以请求返回数据 android开发,在一个网络中可以请求参数返回数据成功,在另一个网络下请求不成功!这是什么原因啊? 解决方案 首先分析这两个网络环境的差异,原因肯定就在这个差异当中.然后分析是发送不成功还是服务器没有收到还是服务器的返回没有收到还是返回的数据是有问题,找到问题在哪里. 解决方案二: 这个网络的差异就是进不去的网络被禁用了一些端口,只是有些接口不可访问,有些接口可以访问.

Android AndBase框架实现多功能标题栏(一)_Android

本文是针对AndBase框架学习整理的第一篇笔记,想要了解AndBase框架的朋友可以阅读本文,大家共同学习. 1.使用AndBase实现多功能标题栏 AndBase框架内部提供了许多的方式能够使我们去设置一个更好的标题栏,进行动态的改变,而并非静态的将标题栏界面写死...能够使得标题栏更加的美观...总体就是动态的获取布局然后通过对布局的操作来自定义一个良好的标题栏... 使用AndBase框架的时候我们的主函数就不是继承于Acticity了,而是继承于AbActivity,万变不离其宗还是A

Android AndBase框架使用封装好的函数完成Http请求(三)_Android

本文是针对AndBase框架学习整理的第三篇笔记,想要了解AndBase框架的朋友可以阅读本文,大家共同学习. 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现有参Http Get请求...    AndBase框架为我们提供了一些相关的方法提供给我们使用,用来完成Http网络请求...总体就是对Http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用Volley框架

Android AndBase框架使用封装好的函数完成Http请求(三)

本文是针对AndBase框架学习整理的第三篇笔记,想要了解AndBase框架的朋友可以阅读本文,大家共同学习. 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现有参Http Get请求... AndBase框架为我们提供了一些相关的方法提供给我们使用,用来完成Http网络请求...总体就是对Http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用Volley框架..楼

Android之使用Android-query框架开发实战(二)_Android

在上篇文章跟大家介绍了Android之使用Android-query框架开发实战(一),本文继续跟大家介绍有关Android-query框架.具体内容请看下文. 异步网络: 1. 添加权限:<uses-permission android:name="android.permission.INTERNET" />  2. 支持的类型  JSONObject JSONArray String (HTML, XML) XmlDom (XML parsing) XmlPullPa

Android之使用Android-query框架开发实战(二)

在上篇文章跟大家介绍了Android之使用Android-query框架开发实战(一),本文继续跟大家介绍有关Android-query框架.具体内容请看下文. 异步网络: 1. 添加权限:<uses-permission android:name="android.permission.INTERNET" /> 2. 支持的类型 JSONObject JSONArray String (HTML, XML) XmlDom (XML parsing) XmlPullPars

Android Xutils框架HttpUtil Get请求缓存问题

  话说,今天和服务器开发人员小小的逗逼了一下,为啥呢?   话说今天有个"收藏产品"的请求接口,是get request的哦,我客户端写好接口后,点击"收藏按钮",返回"收藏成功",我又点了一下,尼玛居然还是"收藏成功",我再点一下,这下对了,返回给我"取消收藏成功",好吧,我又点了一下,彻底郁闷了,居然又是"取消收藏成功",这不是逗我的么?   于是我让服务器人员检查他的接口,是不是

Android App开发的自动化测试框架UI Automator使用教程_Android

Android的自动化测试有很多框架,其中ui automator是google官方提供的黑盒UI相关的自动化测试工具,(GitHub主页:case使用java写,今天实践了一下官方文档中样例程序,其中还是有一些小问题需要总结一下的. 环境准备: 1.JDK(是的,你没看错,基础的android开发环境必备),以及对应的环境变量配置,不会的可以自己百度下下 2.Android Studio(IDE尊崇个人意愿) 3.android SDK以及配置 4.ANT(主要用于build我们的脚本,生成j