`
liujiekasini0312
  • 浏览: 147139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OKHttp的介绍和基本用法

 
阅读更多

嗨,大家好。又和大家见面了,今天我和大家一起来学习一下OKHttp。

OKHttp是基于Http协议上的网络通讯,说白了就是Http协议。Http的功能OKHttp都有。那就问题来了,既然有了Http,这 强大的协议,为什么还需要有OKHttp等将Http封装的架包呢?其实编程是一个工作量大,工作重复性普遍的工作。编程人员都不喜欢做重复性的工作和处理Bug。个人感觉OKHttp就是基于这一系列的因素。所以OKHttp就诞生了。

OkHttp由于基于Http协议,所以http协议都支持。例如请求报文,响应报文,所有的请求方法等多做了很好的的处理。所以有关Http的知识就不详细讲解了,读者可以自己去查询资料了解一下。下面介绍使用OkHttp访问网络。

其实使用OKHttp访问网络很简单,主要通过以下几步:

1、初始化OKHttpClient实例

注:OKHttpClient在整个项目中使用单例模式,尽量直接new实例

//初始化OkHttpClient,OkHttpClient将采用单例模式
private static OkHttpClient okHttpClient = new OkHttpClient();
2、初始化RequestBody实例,用于封装请求的内容(PS:如果使用get请求可以直接省略该步骤)

//初始化RequestBody,用于保存我访问网络的请求信息
RequestBody requestBody = RequestBody.create(JSONTYPE, requestContent);

3、初始化Request实例,用于封装请求信息

Request request = builder.url(url).build();
4、初始化Call实例,用于访问网络

//初始化Call对象,用于访问网络
Call call = okHttpClient.newCall(request);

5、访问网络,OKhttp访问网络提供了两种方法

5.1、同步方法,返回Response对象,该对象封装了网络资源信息

//初始化Response对象,用于显示访问网络的响应头信息
Response response = call.execute();

5.2、异步方法 (PS:异步方法采用Callback接口回调机制)

/*
* 采用异步方法访问网络,返回响应报文信息
* */


public void enqueue(String url, Callback callback, String requestContent) {

    if (requestContent == null || "".equals(requestContent)) {
        //采用异步get方法访问网络
        Request request = this.getRequest(url);
        //初始化Call对象,用于网络连接
        Call call = okHttpClient.newCall(request);
        //采用异步访问网络
        call.enqueue(callback);
        
    } else {
        //采用异步post方法访问网络
        Request request = this.getRequest(url, requestContent);

        //初始化Call对象,用于网络连接
        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);
    }

}


6、通过Response获得网络资源

//初始化ResponseBody对象,用于封装网络资源,该实体用许多访问网络资源的方法
ResponseBody body = response.body();
//以字符串的形式获得网络
result = body.string();
//以字符流的形式获得网络
//body.charStream();

//以字节的形式获得网络
// body.bytes();
//以字节流的形式获得网络
//body.byteStream();
 //获得响应头
  Headers headers = response.headers();

 //遍历响应头信息
for (int i = 0; i < headers.size(); i++){
    Log.d("tag",headers.name(i) + "--->" + headers.value(i));
}


通过以上的步骤就可以访问网络了,很简单嘛。但别以为OKHttp就只有这点功能,我这里仅仅简单介绍一下,帮助大家引进门,最好的学习方法就是看APi,看源码学习,了解大神的编程思想。

下面我将我学习OKHttp过程编写的工具类copy出来,提供大家学习。


/*
*
* 该工具类采用单例模式
* */
public class OkHttpUtils {


    //初始化OkHttpClient,OkHttpClient将采用单例模式
    private static OkHttpClient okHttpClient = new OkHttpClient();
    //初始化OkHttpUtils
    private static OkHttpUtils okHttpUtils = new OkHttpUtils();

    //发送请求消息为Json类型
    private static final MediaType JSONTYPE = MediaType.parse("application/*; charset=utf-8");


    //构造私有的构造器,使外部不能直接创建实例
    private OkHttpUtils() {

    }

    //采用单例模式中饿汉模式
    public static OkHttpUtils getInstance() {
        return okHttpUtils;
    }


    //采用类方法获得单一的OkHttpClient实例
    public static OkHttpClient getOkHttpClient() {
        return okHttpClient;
    }


    /*
    * 获得get方法Request的请求信息
    * */
    private Request getRequest(String url) {

        return getRequest(url, null);
    }


    /*
    * 获取响应头
    * */
    public void getHeader(String url) {

        getHeader(url, null);

    }

    /*
    * 获取响应头
    * */
    public void getHeader(String url, String requestContent) {


        //初始化Request对象用于封装请求消息
        Request request = this.getRequest(url, requestContent);
        try {
            //访问网络,获得响应信息
            Response response = this.execute(request);

            //获得响应头
             Headers headers = response.headers();

            //遍历响应头信息
           for (int i = 0; i < headers.size(); i++){
               Log.d("tag",headers.name(i) + "--->" + headers.value(i));
           }


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

    /*
    * call.execute()访问网络,返回响应报文信息
    * */
    private Response execute(Request request) throws IOException {
        //初始化Call对象,用于访问网络
        Call call = okHttpClient.newCall(request);
        //初始化Response对象,用于显示访问网络的响应头信息
        Response response = call.execute();
        return response;
    }





   /*
    * 采用异步方法访问网络,返回响应报文信息
    * */

    public void enqueue(String url, Callback callback) {


        enqueue(url, callback, null);
    }


    /*
    * 采用异步方法访问网络,返回响应报文信息
    * */


    public void enqueue(String url, Callback callback, String requestContent) {

        if (requestContent == null || "".equals(requestContent)) {
            //采用异步get方法访问网络
            Request request = this.getRequest(url);
            //初始化Call对象,用于网络连接
            Call call = okHttpClient.newCall(request);
            //采用异步访问网络
            call.enqueue(callback);

        } else {
            //采用异步post方法访问网络
            Request request = this.getRequest(url, requestContent);

            //初始化Call对象,用于网络连接
            Call call = okHttpClient.newCall(request);
            call.enqueue(callback);
        }

    }


    /*
    * 获得post方法的Request请求信息,当requestContent信息为null时,默认为get请求
    * */
    private Request getRequest(String url, String requestContent) {

        if ("".equals(requestContent) || requestContent == null) {

            //定义Rquest对象,封装访问网络的请求信息
            //new Request.Builder()创建Request的内部类Builder的对象,默认通过get方法访问网络
            Request.Builder builder = new Request.Builder();
            //关联访问网络的url,并将其转换为Request对象
            Request request = builder.url(url).build();
            return request;
        } else {

            //初始化RequestBody,用于保存我访问网络的请求信息
            RequestBody requestBody = RequestBody.create(JSONTYPE, requestContent);
            //初始化Request,用于封装请求报头
            Request request = new Request.Builder().url(url).post(requestBody).build();
            return request;
        }


    }


    //OkHttpClientget方法
    public Object get(String url) throws IOException {


        Object result = null;
        //关联访问网络的url,并将其转换为Request对象
        Request request = this.getRequest(url);
        Response response = this.execute(request);
        //检测网络是否连接成功
        if (response.isSuccessful()) {

            //获取网连接信息
            String mess = response.message();
            Log.d("tag", "mess = " + mess);
            //初始化ResponseBody对象,用于封装网络资源,该实体用许多访问网络资源的方法
            ResponseBody body = response.body();
            //以字符串的形式获得网络
            result = body.string();
            //以字符流的形式获得网络
            //body.charStream();

            //以字节的形式获得网络
            // body.bytes();
            //以字节流的形式获得网络
            //body.byteStream();
        } else {
            //如果没有连接成功则抛出io异常,答应出错误码
            throw new IOException("Unexcepted code = " + response.code());
        }
        return result;

    }


    //OkHttpClientget方法
    public Object post(String url, String requestContent) throws IOException {

        String result = null;
        //初始化Request,用于封装请求报头
        Request request = this.getRequest(url, requestContent);
        //访问网络,返回相应报文
        Response response = this.execute(request);
        //检测网络是否连接成功
        if (response.isSuccessful()) {

            //获取网连接信息
            String mess = response.message();
            Log.d("tag", "mess = " + mess);
            //初始化ResponseBody对象,用于封装网络资源,该实体用许多访问网络资源的方法
            ResponseBody body = response.body();
            //以字符串的形式获得网络
            result = body.string();
            //以字符流的形式获得网络
            //body.charStream();

            //以字节的形式获得网络
            // body.bytes();
            //以字节流的形式获得网络
            //body.byteStream();
        } else {
            //如果没有连接成功则抛出io异常,答应出错误码
            throw new IOException("Unexcepted code = " + response.code());
        }
        return result;
    }


}


PS: 以上代码可以Copy在项目中直接运行

最后感谢大家的阅读,由于本人是菜鸟,知识有限,有错误的地方欢迎大家提出。


分享到:
评论

相关推荐

    oKHttp基本用法

    以上就是 OkHttp 的基本用法,包括 GET 和 POST 请求的同步与异步执行,以及上传键值对、JSON 数据和文件的方法。在实际项目中,你还可以根据需要进行更复杂的配置,例如设置自签名证书、HTTPS 代理等。了解并熟练...

    Android中okhttp的基本用法2(okHttp的简单封装)

    本篇文章将详细介绍OkHttp的基础使用方法以及一个简单的封装示例。 首先,了解OkHttp的核心概念: 1. **OkHttpClient**:OkHttp的客户端对象,它是整个网络请求的入口点。通过配置不同的拦截器(Interceptor)、...

    Android实战——okhttp3的使用和封装

    本文将深入探讨OkHttp3的使用和封装,旨在帮助开发者更好地理解和掌握这一强大的网络请求工具。 首先,让我们了解OkHttp的基本概念。OkHttp是由Square公司开发的,它提供了一个高效的HTTP客户端接口,具有缓存、...

    java 中OkHttp的使用方法及实例

    本文将详细介绍如何在Java项目中使用OkHttp,以及两种主要的请求方式。 首先,使用OkHttp前需要添加相应的依赖。通常,你可以通过Maven或Gradle来引入OkHttp及其依赖。在Maven的pom.xml文件中,你需要添加以下依赖...

    okhttp使用教程,通过okhttp将数据显示到textView上

    在Android开发中,OkHttp是一个高效且易用的网络请求库,由...通过实践,你将更深入地理解OkHttp的工作原理和用法,提升你的应用程序的网络性能。在实际开发中,还可以结合Retrofit等库进一步简化网络请求的处理。

    volley_okhttp_retrofit三种请求方式的基本用法

    本篇文章将详细讲解Volley、OkHttp和Retrofit这三种常用的网络请求库的基本用法,帮助开发者更好地理解和选择适合自己的请求方式。 **Volley** Volley是由Google官方推出的网络请求库,它专注于Android平台,提供...

    android okHttp的简单使用

    通过上述示例,你已经掌握了OkHttp的基本用法,包括GET和POST请求,以及图片下载和文件上传。在实际应用中,还需要考虑错误处理、异步请求、超时设置等高级特性。同时,使用OkHttp配合Retrofit等库可以进一步简化...

    OkHttp使用案例

    通过上述案例,我们可以看到OkHttp在Android开发中的基本使用方法。这个框架提供了丰富的功能,如HTTPS支持、WebSocket、自动重试、连接池等,使得网络请求变得简单高效。结合实际项目需求,开发者可以灵活地定制...

    OkHttp3使用详解

    下面将详细介绍 OkHttp3 的使用方法。 OkHttp3 的基本使用 OkHttp3 的基本使用主要包括以下几个步骤: 1. 导入 OkHttp3 相关包,包括 okhttp-2.7.5 和 okio-1.13.02。 2. 创建 OkHttpClient 实例,用于发起网络...

    okhttp请求简单封装和cookie管理

    首先,我们了解下OkHttp的基本用法。OkHttp通过构建Request对象来定义网络请求,然后通过OkHttpClient实例发送这个请求。Request对象包含了URL、方法(GET或POST)、请求头和请求体等信息。OkHttpClient则负责处理...

    OKHttp的使用demo

    **OKHttp简介** OKHttp是Square公司开发的一款高效、易用的网络请求库,广泛应用于Android应用开发中。...相比于Android自带的...在实际开发中,熟练掌握OKHttp的使用,能有效提高应用的网络性能和用户体验。

    okhttp基本使用

    以上就是OkHttp基本使用的一些关键点,包括GET和POST请求、文件上传与下载以及拦截器的使用。通过这些功能,开发者可以灵活高效地处理各种HTTP任务。在实际项目中,还可以结合Retrofit等库进一步提升API调用的便利性...

    OKHttp3的使用demo

    以上就是OKHttp3的基本使用方法。通过这些API,开发者可以方便地实现各种网络请求操作,同时享受到OKHttp提供的高效和稳定。在实际项目中,还可以根据需要进行更复杂的配置,例如添加拦截器、处理Cookie、使用HTTPS...

    java 调用okHttp3进行代码测试(SpringBoot项目))

    首先,我们来了解OkHttp3的基本概念。OkHttp3是Square公司推出的一个网络请求库,它通过复用TCP连接、支持HTTP/2协议以及高效的缓存机制,显著提高了网络请求的效率和响应速度。在SpringBoot中集成OkHttp3,可以为...

    Android开发 okhttp网络请求使用demo,包括上传文件方法封装

    总结来说,"Android开发 okhttp网络请求使用demo"是一个实用的学习资源,它涵盖了OkHttp的基础用法和文件上传。通过对这个demo的深入学习,开发者可以更好地理解和运用OkHttp来优化Android应用的网络性能。

    android 的OkHttp3网络的POST和GET请求

    以上就是关于Android的OkHttp3框架中GET和POST请求的基本使用方法,通过这个库,开发者可以高效、安全地进行网络通信。在实际项目中,可以根据需求进行更复杂的定制和优化,例如设置超时、重试策略等。希望这个概述...

    okhttp使用

    OkHttp是Java和Android开发中广泛使用的网络通信库,由Square公司开发,它以其高效、易用和灵活性著称。本篇文章将详细讲解如何在实际项目中使用OkHttp进行HTTP的GET和POST请求。 首先,我们需要理解HTTP的基本概念...

    Android-对Okhttp3进行二次封装

    首先,我们需要了解OkHttp3的基本用法。OkHttp通过构建Request对象并将其发送到服务器来发起网络请求。二次封装的目标是隐藏这些细节,提供一个简洁易用的接口给开发者。以下是一些核心概念: 1. **创建...

    OkHttp的简单使用

    下面将详细介绍OkHttp的简单使用。 一、OkHttp的优势 1. **缓存机制**:OkHttp支持自动缓存,可以减少不必要的网络请求,提高用户体验。 2. **线程安全**:OkHttp是线程安全的,可以在多个线程中并发使用。 3. **...

    Retrofit+Okhttp 使用 Eclipse版

    在Android开发中,Retrofit和OkHttp是两个非常重要的网络请求库。Retrofit是由Square公司推出的,它将网络请求转换为简单的...通过理解这两个库的工作原理和使用方法,你可以更轻松地处理Android应用的网络通信需求。

Global site tag (gtag.js) - Google Analytics