OkHttp使用Get和Post访问服务器的工具类(一)

首先来简单介绍一下okttp框架,类似于HttpUrlConnection,Android6.0以后,废弃了Apache Http Client,只有HttpUrlConnection和OkHttp了,相对而言,OkHttp越来越受到开发者的喜爱,那么它的优势在哪呢?

1,支持SPDY,共享同一个Socket来处理同一个服务器的所有请求
2,如果SPDY不可用,则通过连接池来减少请求延时
3,无缝的支持GZIP来减少数据流量
4,缓存响应数据来减少重复的网络请求

SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。

ZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。

好了,下面来看封装类
1.HttpCallBackListener
public  interface  HttpCallbackListener {
    void onFinish(String response);

    void onError(Exception e);
}

2.主体

import android.util.Log;

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

/**
 * Created by liang on 2016/8/15.
 */
public class OkHttpUtil {
    public static final MediaType JSON= MediaType.parse("application/json; charset=utf-8");

    public static void sendHttpRequestForGet(final String path, final Map<String, String> params, final HttpCallbackListener listener) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                try {
                    final  StringBuilder response_builder = new StringBuilder();
                    final StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.append(path).append("?");
                    if (params != null && params.size() != 0) {
                        for (Map.Entry<String, String> entry : params.entrySet()) {
                            //转换成UTF-8
                            stringBuilder.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
                            stringBuilder.append("&");
                        }
                        //删除最后一个字符&
                        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                    }
                    //此时网址变长了,增加了Map中的内容
                    URL url = new URL(stringBuilder.toString());
                    Request request = new Request.Builder().url(url).build();

                    //必须要有实例化过后的对象!!!
                    okHttpClient.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Request request, IOException e) {

                        }
                        //通过response可以得到code,message,url等信息
                        @Override
                        public void onResponse(Response response) throws IOException {
                            //读取返回的数据
                            InputStream in = response.body().byteStream();
                            BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));
                            String line;
                            while ((line = reader.readLine()) != null) {
                                response_builder.append(line);
                            }
                            Log.e("OkHttpUtil", response.toString());
                            //将数据传进MainActivity
                            if (listener != null) {
                                listener.onFinish(response_builder.toString());
                            }
                        }
                    });

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public static void sendHttpRequestForPost(final String path, final Map<String, String> paramsValue, final HttpCallbackListener listener){
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                try{
                    final  StringBuilder response_builder = new StringBuilder();
                    JSONObject jsonObject = new JSONObject();
                    for(Map.Entry<String,String> entry:paramsValue.entrySet()){
                        jsonObject.put(entry.getKey(),entry.getValue());
                    }
                    //请求的主体
                    RequestBody requestBody=RequestBody.create(JSON,jsonObject.toString());
                    Request request=new Request.Builder().url(path).post(requestBody).build();
                    //使用异步的方法
                    okHttpClient.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Request request, IOException e) {
                            Log.e("OkHttpUtil","response fail");
                        }

                        @Override
                        public void onResponse(Response response) throws IOException {
                            //读取返回的数据
                            InputStream in = response.body().byteStream();
                            BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));
                            String line;
                            while ((line = reader.readLine()) != null) {
                                response_builder.append(line);
                            }
                            Log.e("OkHttpUtil", response.toString());

                            if (listener != null) {
                                listener.onFinish(response_builder.toString());
                            }
                        }
                    });

                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

这只是一个小小的例子,适合小白入门使用。

原文地址:https://www.cnblogs.com/Liang-Blog/p/5774250.html