OKHTTP学习之基础知识及运用

OKHTTP简介

okhttp是一个现代化的高效的http库。它能使资源下载的更快和节省带宽。
okttp的高效体现在:
* http/2 允许多个访问同一主机地址的请求共享同一个socket。
* 连接池减少了请求的延时
* 通过GZIP压缩下载时的文件大小
* Response缓存机制避免了网络请求完成时其它重复的请求。

如果你配置了多个服务端的IP地址,网络请求失败时,okhttp能够切换ip地址进行重连。
okhttp的使用非常简单和方便,通过一些简单明了的配置就可。
okhttp访问网络的时候,支持同步阻塞调用和异步回调两种方式。
okhttp支持Android 2.3以上版本,jdk版本为1.7以上。

以上是来自官网的翻译。我想说的是如果想要体会到okhttp的好处,就要了解Android网络访问的过去。正所谓是—-“如果你认识从前的我,也许会原谅现在的我。”。哦不对!!!应该是—–如果你认识从前的我,肯定会喜欢上现在的我。

网络访问的远古时代

HTTPUrlConnection

以前自学的时候,网络上介绍Android的访问方式是这样:

private void testUrlConnect(){
        String host = "http://blog.csdn.net/briblue";
        try {
            URL url = new URL(host);
            HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();

            if(httpconn.getResponseCode()  == HttpURLConnection.HTTP_OK){

                InputStreamReader isr = new InputStreamReader(
                        httpconn.getInputStream(),"utf-8");
                int i = 0;
                String content = "";
                while((i = isr.read()) != -1){
                    content = content+(char)i;
                }

                isr.close();
                final String info = content;
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mInfo.setText(info);
                    }
                });

            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

HttpClient

后来他来了一个兄弟,著名的Apache HttpClient,它的访问方式如下:

private void testHttpClient(){
    String host = "http://blog.csdn.net/briblue";
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(host);

    ResponseHandler<String> responseHandler = new BasicResponseHandler();

    try {
        String content = httpclient.execute(httpget,responseHandler);


        System.out.println(content);
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        httpclient.getConnectionManager().shutdown();
    }
    }

上面可以看到httpclient比httpurlclient使用起来还是方便很多。

Volley

再后来谷歌发布了一个重要的http库Volley。当时我还专门研究过,并应用到了自己的项目代码,这里不做简介。它的底层可以配置使用httpclient和httpurlconnection,当然也可以配置我们今天的主角okhttp.

volley的优势是小而频繁的网络请求,volley本身的字面意思就是万箭齐发。
volley的缺点不适合上传和下载的操作。

android api 23删除了httpclient

Android6.0删除了httpclient的相关包,而推荐使用HttpUrlConnection.这个我不做评价,可能是HttpUrlConnection的性能更高吧。但HttpUrlConnection真心不好用,需要封装,除了Volley外,okhttp是个不错的选择,下面我们开始讲okhttp的知识

OKHttp基本使用

前面的文章有介绍了HTTPUrlConnection与HttpClient的基本使用,这里开始介绍OKHttp如何编写代码。

okhttp的包的导入

在AndroidStudio中在依赖中引入如下:

dependencies {
    ......
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    .....
}

如果是Eclipse,则去官网下载jar包。
点击这里

GET

下面是一个简单的get请求。

private void testGet() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                OkHttpClient mOkClient = new OkHttpClient();
                final Request request = new Request.Builder().url("http://blog.csdn.net/briblue").build();
                final Response response = mOkClient.newCall(request).execute();
                final String info = response.body().string();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mInfo.setText(info);
                    }
                });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

整个流程是
1. 创建OkHttpClient对象。
2. 创建Request对象
3. 通过OkHttpClient对象调用请求,并得到Response.
4. 得到Response的信息并进行相应的业务处理。

可以看到非常的简单

post

在这里多说一句,因为没有找到网上免费的可以进行post请求的api,所以自己用Php写了一个简单的接受post请求的页面。
用的环境是网络下下载的Phpnow套件,这是个绿色小巧的Php开发环境,下载解压到一个没有中文字符路径下,然后在package/htdocs目录下编写自己的代码就可以了。我编写了一个简单的testpost.php

<?php
$post = $GLOBALS['HTTP_RAW_POST_DATA'];
//打印传过来的post数据
echo "hello you send a message:".$post;

我原本是想解析json数据的,后来发现这玩意没有这扩展。所以只得打印传过来的json数据。大家想让服务端更牛x一点,可以下载wamp套件。它同样是一个Php开发运行环境,但功能丰富得多。

好了,android的如何用okhttp发送post请求?

private void testPost() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                String host = "http://172.26.133.50//testpost.php";
                final MediaType JSON
                        = MediaType.parse("application/json; charset=utf-8");

                OkHttpClient client = new OkHttpClient();

                String json = "{\"username\":\"frank\",sex:\"man\"}";
                RequestBody body = RequestBody.create(JSON, json);
                Request request = new Request.Builder()
                        .url(host)
                        .post(body)
                        .build();

                Response response = null;
                try {
                    response = client.newCall(request).execute();
                    final String info = response.body().string();

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mInfo.setText(info);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }).start();

运行的结果是界面上出现了如下字符串:

hello you send a message:{username:”frank”,sex:”man”}

同步与异步

前面示例讲得其实都是同步请求。因为它们用了execute()方法。
方法原型如下:

Response execute()
          throws IOException

Invokes the request immediately, and blocks until the response can be processed or is in error. 

如果要用异步的方式的话,就要用另外一个方法enqueue
方法原型如下:

void enqueue(Callback responseCallback)

Schedules the request to be executed at some point in the future. 

异步发送请求

这里以get为例,改写上面的方法

private void  asyncGet(){
        final Request request = 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frank909

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值