zoukankan      html  css  js  c++  java
  • volley+okhttp封装,一行代码就可访问网络

    volley+okhttp封装,一行代码就可访问网络

    前言:

    我写这个可能不会完全的教会你去怎么封装一个网络框架,我的目的在于让你不需要你自己封装就可以访问网络,或者说互相学习也可以,我只是想让你大概的了解下我的思路,最主要的就是教你如何使用它,并且将它应用在自己的项目中。因为现在的volley很火,而且okhttp也很火,这二者结合非常适合网络请求,具体有什么好处,大家可以自行百度,这里就不啰嗦了。

    简介

    支持post,get请求,上传单个文件,上传多个文件,表单提交

    如何一行代码就可以访问网络

    1,访问网络带参数post请求

       String url = "http://dev.bodyplus.cc:8088/api/users?do=smsCode";
            //参数
            Map<String, String> params = new HashMap<>();
            params.put("smsType", "1");
            params.put("smsPhone", "18219200511");
            params.put("type", "2");
            //最主要的就是这一行
            NetworkUtils.getInstance().sendPostRequest(url, params, new RequestCallback() {
                @Override
                public void onSuccess(Object object) {
    
                    Log.d("1008611", object.toString());
                    data.setText(object.toString());
                }
    
                @Override
                public void onFail(String string) {
                    Log.d("1008611", string);
                    data.setText(string);
                }

    这需要调用上面这个方法就可以访问网络了,是不是很简单

    2,上传一个带参数的文件

            //上传地址
            String url = "";
    
            //参数
            Map<String, String> params = new HashMap<>();
    
            params.put("key", "value");
    
            String path = "";
            //需要上传的文件
            File file = new File(path);
    
            NetworkUtils.getInstance().uploadFile(url, params, "file", file, new RequestCallback() {
                @Override
                public void onSuccess(Object object) {
    
                }
    
                @Override
                public void onFail(String string) {
                }
            });

    封装大致思路

    从上面的方法可以看出,入口是NetworkUtils这个类,这个类里的方法

            /**
         * 支持post 带参数的请求
         *
         * @param url      访问的地址
         * @param params   访问需要加的参数
         * @param callback 访问的回调
         */
        public void sendPostRequest(String url, Map<String, String> params, final RequestCallback callback) {
            if (UiUtils.hasNetwork()) {
                CustomRequest customRequest = new RequestBuilder().url(url).params(params).post().succesListener(new Response.Listener() {
                    @Override
                    public void onResponse(Object response) {
                        try {
                            JSONObject jsonObject = new JSONObject(response.toString());
    
                            String msg = getMsg(jsonObject);
    
                            if (validationStatusCode(jsonObject)) {
                                callback.onSuccess(response);
                            } else {
                                callback.onFail(msg);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            callback.onFail("服务器异常");
                        }
    
                    }
                }).errorListener(new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
    
                        if (!TextUtils.isEmpty(error.getMessage())) {
                            callback.onFail(error.getMessage());
                        } else {
                            callback.onFail("服务器异常");
                        }
                    }
                }).build();
                HttpClientRequest.getInstance().addRequest(customRequest);
            } else {
                callback.onFail("网络掉线了!");
            }
        }

    HttpClientRequest.getInstance().addRequest(customRequest);这行代码执行后就可以访问网络了,是的,里面的参数是一个request,这个request是自定义的,CustomRequest类里可以添加http的头,在这里可以添加cookie,或者存储cookie,具体可以下载Demo查看,还有一个类就是HttpClientRequest,这个类的方法:

      public RequestQueue getRequestQueue() {
            if (mRequestQueue == null) {
                mRequestQueue = Volley.newRequestQueue(UiUtils.getContext(), new OkHttpStack());
            }
            return mRequestQueue;
        }

    当然不是这一个方法,还有其他的方法,在这个方法里使用了OkHttpStack, 
    因为最终我要使用的是OkHttpClient,所以在这个类里,使用了OkHttpClient,可以在Demo查看。

    如何使用

    至于实现的思路,可能这样不会讲的很清楚,但是咱们都是看代码都能懂得人就不用讲的太多了,最主要的还是如何使用啦

    很简单,按照我说的做,你就可以使用啦,

    netutils的包下就是这个访问网络的所有类,所以直接复制到你的项目里

    这里写图片描述

    还有一个就是libs下有两个jar包,也复制到你的项目里

    这里写图片描述

    另外一个就是gradle文件

    dependencies {
        compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
        compile 'com.squareup.okhttp3:okhttp:3.4.0-RC1'
        compile 'com.google.code.gson:gson:2.7'
        compile files('libs/org.apache.http.legacy.jar')
        compile files('libs/httpmime-4.2.5.jar')
    }
    

    做完了这些,就算移植成功了

    最后的话

    不能光会使用,还得了解下他的原理,不在这介绍原理了就,网上有很多人讲的都很明白,也可以看看源码,这个封装就是仿照源码完成的。

    Demo地址: https://github.com/FussenYu/HttpDemo

    点击下载Demo

  • 相关阅读:
    Linux常用命令大全详解
    C++语言关键字及注解
    求两数的最大公约数
    ICOP完成端口详解
    C/C++常见面试题
    猴子吃桃问题之《C语言经典案例分析》
    DTD
    DTD
    DTD的使用
    Rust
  • 原文地址:https://www.cnblogs.com/zyanrong/p/5694271.html
Copyright © 2011-2022 走看看