Android网络请求框架----Okhttp3完全解析(1),使用篇

1.前言:

最近在改项目的时候发现以前的项目网络请求框架是XUtils,这在过去是一个比较流行的框架,功能强大而且比较全面,但是就XUtils本身的网络请求模块而言,因为Google在android6.0中已经将HttpClient部分给删除,当我把开发工具的compileSdkVersion调到23以上,该框架就会出错,Volley这个框架也是一样,内部也是HttpClient和HttpUrlConnection实现的,所以如果你的项目中还是用了这些古老的框架,还是赶紧换吧。

先来看一张okhttp的脑图(copy而来的)
这里写图片描述

2.使用:

2.1 集成:

androidstudio直接在gradle中添加:
dependencies
{
compile ‘com.squareup.okhttp3:okhttp:3.5.0’
}
在manifest中添加网络权限。

2.2 使用类型:

2.2.1 Get方式:

步骤: new OkHttpClient ()
Request.Builder方便添加header
call.enqueue异步执行

//get请求方式
    private void httpGet() {
        String url="http://www.baidu.com";
        //client对象,核心类
        OkHttpClient client=new OkHttpClient();
        //构建者模式,url地址,get方式,
//        final Request request=new Request.Builder().url(url).get().build();

        //用requestBuilder可以添加header
        Request.Builder requestBuilder = new Request.Builder().url(url);
        requestBuilder.addHeader("key","value")

        Request request=requestBuilder.build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //子线程中
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String str=response.body().string();

             //子线程中,response.body()中既可以获取String,也可以获取成byte数组,或者是stream
            }
        });

    }

注意:callback中的failure和success的方法都是在非ui线程中,如果涉及到控件的刷新,一定要在主线程中进行处理。
OkHttp的添加header有两种方式:
使用 header(name,value) 来设置HTTP头的唯一值,相同的key值会覆盖
使用 addHeader(name,value) 来补充新值,不会覆盖相同的key值
使用 header(name) 读取唯一值或多个值的最后一个值
使用 headers(name) 获取所有值

2.2.2 表单提交(key-value形式)

 //键值对参数提交(表单提交)
    private void httpPost() {
        String url="";
        //client对象,核心类
        OkHttpClient client=new OkHttpClient();
        //构建者模式,url地址,get方式,
//        final Request request=new Request.Builder().url(url).get().build();


        //这里面添加参数
        RequestBody requestbody=new FormBody.Builder()
                .add("key1","param1")
                .add("key2","param2")
                .build();
        //用requestBuilder可以添加header
        Request.Builder requestBuilder = new Request.Builder().url(url).post(requestbody);

        requestBuilder.addHeader("key","value");

        Request request=requestBuilder.build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //子线程中
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String str=response.body().string();
                //子线程中
            }
        });
    }

2.2.3请求体是一个JSON格式的数据

 private void httpPostJson() {
        String url="";
        //client对象,核心类
        OkHttpClient client=new OkHttpClient();

        //这里面添加参数
        Map<String,String> map=new HashMap<>();
        map.put("key1","param1");
        map.put("key2","param2");
        map.put("key3","param3");

    //这里用的是fastjson进行解析的
        String jsonstr= JSON.toJSONString(map);
        RequestBody requestbody = RequestBody.create(MediaType.parse("application/json"), jsonstr);
        //用requestBuilder可以添加header
        Request.Builder requestBuilder = new Request.Builder().url(url).post(requestbody);
        requestBuilder.addHeader("key","header1");

        Request request=requestBuilder.build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //子线程中
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String str=response.body().string();
                //子线程中
            }
        });
    }

post的代码也比较简单,相信大家肯定能都看懂。但是在这里面涉及到一个比较重要的类MediaType,该类来指定post上传的参数类型。
FormBody涉及常见的有三种:
application/x-www-form-urlencoded 数据是个普通表单
multipart/form-data 数据里有文件
application/json 数据是个json
但是好像以上的普通表单并没有指定MediaType,这是因为FormBody继承了RequestBody,它已经指定了数据类型为application/x-www-form-urlencoded。

2.2.4 上传file文件(以图片为例)

   //文件的上传
    private void httpFileUp() {
        OkHttpClient client = new OkHttpClient();
        final MediaType MEDIA_TYPE_TEXT = MediaType.parse("image/png");
        File file=new File("wy.png");
        MultipartBody multipartBody=new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file",file.getName(),RequestBody.create(MEDIA_TYPE_TEXT,file))
                .build();

        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .post(multipartBody)
                .build();
         client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            }
        });

    }

对于文件上传,我们用RequestBody的另一个继承类MultipartBody,该类首先需要setType,这里面的参数参有五种类型:

  public static final MediaType MIXED = MediaType.parse("multipart/mixed");

  public static final MediaType ALTERNATIVE = MediaType.parse("multipart/alternative");

  public static final MediaType DIGEST = MediaType.parse("multipart/digest");

  public static final MediaType PARALLEL = MediaType.parse("multipart/parallel");

  public static final MediaType FORM = MediaType.parse("multipart/form-data");

源码中有相应的解释,当为FORM时,`final MediaType MEDIA_TYPE_TEXT = MediaType.parse(“image/png”);这行代码的类型指定参数可以参考:点击查看,如果接口没有file字段,直接上传文件,可以这样写:.post(RequestBody.create(MEDIA_TYPE_TEXT, file))

2.2.5 下载文件:

 private void httpFileDown() {
        OkHttpClient mOkHttpClient = new OkHttpClient();
        String url = "";
        Request request = new Request.Builder().url(url).build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) {
                InputStream inputStream = response.body().byteStream();
                FileOutputStream fileOutputStream = null;
                try {
                    fileOutputStream = new FileOutputStream(new File("/sdcard/wy.jpg"));
                    byte[] buffer = new byte[2048];
                    int len = 0;
                    while ((len = inputStream.read(buffer)) != -1) {
                        fileOutputStream.write(buffer, 0, len);
                    }
                    fileOutputStream.flush();
                } catch (IOException e) {

                }

            }
        });
    }

文件下载比较简单,其实就是一个get请求,获取到数据流后写进文件中即可。

总结:熟悉以上方法后,我们基本上能够应对android开发中的网络请求了,但是很明显,项目中的接口有很多,每次这样写肯定费事,而且OkHttpClient 一般一个项目中只需要一个全局对象,并且相关的参数比如参数,缓存也没有设置,所以这篇博客权当入门使用,感兴趣的可以看我的下一篇,Android网络请求框架—-Okhttp3完全解析(2),封装框架

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp是一个处理网络请求的开源项目,是Android使用最广泛的网络框架。它适用于Android 5.0(API级别21)和Java 8。使用OkHttp发送HTTP请求的过程如下: 1. 域名解析(DNS):将域名解析为IP地址。 2. 建立TCP连接:通过三次握手建立TCP连接。 3. 发起HTTP请求:建立TCP连接后,使用Socket输出流将HTTP报文写出。 4. 等待响应:等待服务器响应。 5. 解析响应:解析服务器返回的HTTP响应。 6. 处理响应数据:根据需要处理响应数据,比如解析JSON或下载文件。 在使用OkHttp时,首先需要创建一个Request对象,可以使用Request.Builder()来构建。然后通过Request对象获得一个Call对象,可以使用client.newCall(request)来创建。接下来,可以使用call.execute()进行同步调用或者call.enqueue()进行异步调用。最后,可以通过Response对象获取响应数据。 总之,使用OkHttp很简单,它的请求/响应API使用了流畅的构建器设计和不可变性设计,支持同步阻塞调用和带有回调的异步调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [androidOkHttp使用](https://blog.csdn.net/hanjiexuan/article/details/115894233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [android okhttp的基础使用【入门推荐】](https://download.csdn.net/download/weixin_38516386/12788438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值