HttpClient的简单使用

HttpClient接口是由Apache提供的,如果要使用就必须在gradle文件的android节点下添加一句useLibrary “org.apache.http.legacy”,具体如下:

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"
    useLibrary "org.apache.http.legacy"
    ...
}

这样我们就可以开始使用HttpClient接口
使用步骤(get请求为例):
1、获取HttpClient对象,通常new一个DefaultHttpClient类;

HttpClient client=new DefaultHttpClient();

2、获取HttpGet对象,requestUrl这个字符串是我们要请求的Url

HttpGet get=new HttpGet(requestUrl);

3、可以设置一下请求头信息,通过HttpGet对象的addHeader方法

get.addHeader("Connection","keep-alive");

4、要想获取服务端的响应就要创建HttpResponse对象,通过如下方法就可以把请求和响应关联起来

HttpResponse response=client.execute(get);

5、之后就可以用响应对象response做响应操作
如获取响应状态码:

int statusCode=response.getStatusLine().getStatusCode();

通常只有状态码为200,我们才会继续操作,否则都不作过处理
例如状态码是200,我们就获取响应实体数据

HttpEntity entity=response.getEntity();

通过流的方式获取数据内容,字符串entityContent就是具体内容

InputStream is=entity.getContent();
String entityContent=read(is);

HttpClient接口的使用相当简单,但这里有两点要注意,一个是要授予上网权限

<uses-permission android:name="android.permission.INTERNET" />

一个是在高版本android关于网络请求的操作都要放到子线程来实现

最后下面有一个做了简单封装的工具类,其他不多说,直接上代码

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
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 java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;


public class HttpUtil {
    static int responseCode=0;
    public static void post(final String url, Map<String,String> params, final HttpCallListener listener){
        //参数处理
        final List<NameValuePair> data=new ArrayList<>();
        Set<String> keys=params.keySet();
        if(keys.size()>0){
            for(String p:keys){
                data.add(new BasicNameValuePair(p,params.get(p)));
            }
        }
        final String requestUrl=url;
        final List<NameValuePair> datas=data;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpClient client=new DefaultHttpClient();
                    HttpPost post=new HttpPost(requestUrl);
                    post.addHeader("Connection","keep-alive");
                    post.setEntity(new UrlEncodedFormEntity(datas,"utf-8"));
                    //http响应对象
                    HttpResponse response=client.execute(post);
                    //http状态码
                    final int statusCode=response.getStatusLine().getStatusCode();
                    //获取实体数据
                    HttpEntity entity=response.getEntity();
                    //输入流
                    InputStream is=entity.getContent();
                    String entityContent=read(is);
                    is.close();
                    if(statusCode>=200&&statusCode<300){
                        listener.success(statusCode,entityContent);
                    }else {
                        listener.error(statusCode,entityContent);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    public static void get(String url, Map<String,String> params, final HttpCallListener listener){
        //参数处理
        Set<String> keys=params.keySet();
        StringBuilder stringBuilder=new StringBuilder();
        if(keys.size()>0&&!url.endsWith("?")){
            url+="?";
        }
        for(String p:keys){
            stringBuilder.append(p+"="+params.get(p)+"&");
        }
        final String requestUrl=url;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpClient client=new DefaultHttpClient();
                    HttpGet get=new HttpGet(requestUrl);
                    get.addHeader("Connection","keep-alive");
                    //http响应对象
                    HttpResponse response=client.execute(get);
                    //http状态码
                    int statusCode=response.getStatusLine().getStatusCode();
                    //获取实体数据
                    HttpEntity entity=response.getEntity();
                    //输入流
                    InputStream is=entity.getContent();
                    String entityContent=read(is);
                    is.close();
                    if(statusCode>=200&&statusCode<300){
                        listener.success(statusCode,entityContent);
                    }else {
                        listener.error(statusCode,entityContent);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    //监听请求返回结果的抽象类
    public abstract static class HttpCallListener{
        public abstract void success(int code,String data);
        public abstract void error(int code,String data);
    }

    public static String read(InputStream is){
        BufferedReader dr= null;
        try {
            dr = new BufferedReader(new InputStreamReader(is,"gbk"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        StringBuffer stringBuffer=new StringBuffer();
        String line="";
        try {
            while ((line=dr.readLine())!=null){
                stringBuffer.append(line+"\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuffer.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值