工具介绍

使用:
  • AndroidStudio:【compile 'com.squareup.okhttp3:okhttp:3.4.2'】和【compile 'com.zhy:okhttputils:2.6.2'】和【compile 'com.google.code.gson:gson:2.3.1'】
  • eclipse:添加okthttp、okio、gson的jar包,复制okhttputils的源码到项目中

封装的功能
  • 一般的get请求
  • 一般的post请求
  • 基于Http Post的文件上传(类似表单)
  • 文件下载/加载图片
  • 上传下载的进度回调
  • 支持取消某个请求
  • 支持自定义Callback
  • 支持HEAD、DELETE、PATCH、PUT
  • 支持session的保持
  • 支持自签名网站https的访问,提供方法设置下证书就行
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
android:name="com.bqt.okhttp.MyApplication"

Application

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //对于Https,框架中提供了一个类HttpsUtils,可设置为:可访问所有的https网站、设置具体的证书、双向认证
        //同样的,框架中只是提供了几个实现类,你可以自行实现SSLSocketFactory,传入sslSocketFactory方法中即可
        HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
        //对于cookie,直接通过cookiejar方法配置,当然也可以自己实现CookieJar接口,编写cookie管理相关代码。
        //对于持久化cookie,还可以使用https://github.com/franmontiel/PersistentCookieJar.相当于框架中只是提供了几个实现类,你可以自行定制或者选择使用
        //        ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationContext()));
        //     CookieJarImpl cookieJar = new CookieJarImpl(new MemoryCookieStore());
        OkHttpClient okHttpClient = new OkHttpClient.Builder()//
                .connectTimeout(10000L, TimeUnit.MILLISECONDS)//
                .readTimeout(10000L, TimeUnit.MILLISECONDS)//
                //对于Log,初始化OkhttpClient时,通过设置拦截器实现,框架中提供了一个LoggerInterceptor,当然你可以自行实现一个Interceptor 
                .addInterceptor(new LoggerInterceptor("TAG"))//
                //                .cookieJar(cookieJar)
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                })//
                .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)//
                .build();
        //默认情况下,将直接使用okhttp默认的配置生成OkhttpClient,如果有任何配置,记得在Application中调用initClient方法进行设置。
        OkHttpUtils.initClient(okHttpClient);
    }
}

MainActivity


public class MainActivity extends ListActivity {
    private User mUser;
    private String user = "103468";
    private String pass = "103468";
    private String session_id;
    private String uid;
    private String mBaseUrl = "http://tapi.95xiu.com/";
    private TextView mTv;
    private ImageView mImageView;
    private ProgressBar mProgressBar;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String[] array = { "post方式提交键值对数据", "get方式提交键值对数据", "post方式提交键值对数据文件", "post方式提交文件",//
                "post方式提交Json数据", "get方式获取图片", "get方式下载文件", "清除Session", };
        for (int i = 0; i < array.length; i++) {
            array[i] = i + "、" + array[i];
        }
        mTv = new TextView(this);// 将内容显示在TextView中
        mTv.setTextColor(Color.BLUE);
        mTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
        mTv.setPadding(20, 10, 20, 10);
        mImageView = new ImageView(this);
        mProgressBar = new ProgressBar(this);
        mProgressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
        mProgressBar.setMax(100);
        getListView().addFooterView(mProgressBar);
        getListView().addFooterView(mTv);
        getListView().addFooterView(mImageView);
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
        case 0:
            postWithParams(); //post方式提交键值对数据
            break;
        case 1:
            getWithParams(); //get方式提交键值对数据
            break;
        case 2:
            postParamsAndFile(); //post方式提交键值对数据,同时提交文件
            break;
        case 3:
            postFile();//post方式提交文件---------------------用不到
            break;
        case 4:
            postJson();//post方式提交Json数据
            break;
        case 5:
            getImage();//get方式获取图片
            break;
        case 6:
            downloadFile();//get方式下载文件
            break;
        case 7:
            clearSession();//清除Session
            break;
        }
    }

    //post方式提交键值对数据
    public void postWithParams() {
        String url = mBaseUrl + "user/loginv2.php";
        OkHttpUtils.post().url(url).addParams("user", user).addParams("pass", pass).build().execute(new StringCallback() {
            @Override
            public void onBefore(Request request, int id) {
                mTv.setText("onBefore...\n\n");
            }
            @Override
            public void onAfter(int id) {
                mTv.append("onAfter...");
            }
            @Override
            public void onError(Call call, Exception e, int id) {
                e.printStackTrace();
                mTv.append("onError:" + e.getMessage() + "\n\n");
            }
            @Override
            public void onResponse(String response, int id) {
                mTv.append(response + "\n\n");
                Log.i("bqt", response);
                mUser = new Gson().fromJson(response, User.class);
                uid = mUser.getMsg().getId();
                session_id = mUser.getMsg().getSession_id();
            }
        });
    }
    //get方式提交键值对数据
    public void getWithParams() {
        String url = mBaseUrl + "app/news/index.php";
        OkHttpUtils.get().url(url).id(100).addParams("session_id", session_id).addParams("uid", uid).build().execute(new MyStringCallback());
    }
    //post方式提交键值对数据,同时提交文件
    public void postParamsAndFile() {
        String url = mBaseUrl + "myprofile/editinfo.php";
        File file = new File(Environment.getExternalStorageDirectory(), "bqt.jpg");
        if (!file.exists()) {
            Toast.makeText(MainActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();
            return;
        }
        Map<String, String> params = new HashMap<>();
        params.put("session_id", session_id);
        params.put("uid", uid);
        OkHttpUtils.post().addFile("image", "文件名", file).url(url).params(params).build().execute(new MyStringCallback());//可以提交多个文件
    }
    //post方式提交文件---------------------用不到
    public void postFile() {
        String url = "http://app.fulijr.com/api/v1.3.4/a61000b6a80a";
        File file = new File(Environment.getExternalStorageDirectory(), "bqt.jpg");
        if (!file.exists()) {
            Toast.makeText(MainActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();
            return;
        }
        OkHttpUtils.postFile().url(url).file(file).build().execute(new MyStringCallback());
    }
    //post方式提交Json数据
    public void postJson() {
        String url = mBaseUrl + "user/loginv2.php";
        OkHttpUtils.postString().url(url).mediaType(MediaType.parse("application/json; charset=utf-8")).content(new Gson().toJson(mUser)).build()
                .execute(new MyStringCallback());
    }
    //get方式获取图片
    public void getImage() {
        String url = "http://d.hiphotos.baidu.com/image/pic/item/e4dde71190ef76c6cc15d5839816fdfaae516756.jpg";
        OkHttpUtils.get().url(url).tag(this).build().connTimeOut(20000).readTimeOut(20000).writeTimeOut(20000)//
                .execute(new BitmapCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        mTv.setText("onError:" + e.getMessage());
                    }
                    @Override
                    public void onResponse(Bitmap bitmap, int id) {
                        mImageView.setImageBitmap(bitmap);
                    }
                });
    }
    //get方式下载文件
    public void downloadFile() {
        String url = "http://d.hiphotos.baidu.com/image/pic/item/e4dde71190ef76c6cc15d5839816fdfaae516756.jpg";
        String filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
        OkHttpUtils.get().url(url).build().execute(new FileCallBack(filePath, "包青天.jpg") {
            @Override
            public void onBefore(Request request, int id) {
                mTv.setText("onBefore...\n\n");
            }
            @Override
            public void onAfter(int id) {
                mTv.append("onAfter...");
            }
            @Override
            public void inProgress(float progress, long total, int id) {
                mProgressBar.setProgress((int) (100 * progress));
                mTv.append(progress + "\n");
            }
            @Override
            public void onError(Call call, Exception e, int id) {
                e.printStackTrace();
                mTv.append("onError:" + e.getMessage() + "\n\n");
            }
            @Override
            public void onResponse(File file, int id) {
                mTv.append(file.getAbsolutePath() + "\n\n");
            }
        });
    }
    //清除Session
    public void clearSession() {
        CookieJar cookieJar = OkHttpUtils.getInstance().getOkHttpClient().cookieJar();
        if (cookieJar instanceof CookieJarImpl) {
            ((CookieJarImpl) cookieJar).getCookieStore().removeAll();
        }
    }
    //其他请求方式
    public void otherRequestDemo() {
        //also can use delete ,head , patch
        OkHttpUtils.put().url("http://11111.com").requestBody("may be something").build()//
                .execute(new MyStringCallback());
        try {
            OkHttpUtils.head().url("http://11111.com").addParams("name", "zhy").build().execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        OkHttpUtils.getInstance().cancelTag(this);
    }
    public class MyStringCallback extends StringCallback {
        @Override
        public void onError(Call call, Exception e, int id) {
            e.printStackTrace();
            mTv.setText("onError:" + e.getMessage());
        }
        @Override
        public void onResponse(String response, int id) {
            mTv.setText("onResponse:" + decodeUnicodeToString(response));
        }
    }
    /**将Unicode编码解析成字符串形式(如汉字) */
    public static String decodeUnicodeToString(String uString) {
        StringBuilder sb = new StringBuilder();
        int i = -1, pos = 0;
        while ((i = uString.indexOf("\\u", pos)) != -1) {
            sb.append(uString.substring(pos, i));
            if (i + 5 < uString.length()) {
                pos = i + 6;
                sb.append((char) Integer.parseInt(uString.substring(i + 2, i + 6), 16));
            }
        }
        sb.append(uString.substring(pos));
        return sb.toString();
    }
}

附件列表

okhttp 常用使用方式 封装 演示的更多相关文章

  1. Visaul Studio 常用快捷键的动画演示

    从本篇文章开始,我将会陆续介绍提高 VS 开发效率的文章,欢迎大家补充~ 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以 ...

  2. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  3. 前后端常用通讯方式-- ajax 、websocket

    一.前后端常用通讯方式 1. ajax  浏览器发起请求,服务器返回数据,服务器不能主动返回数据,要实现实时数据交互只能是ajax轮询(让浏览器隔个几秒就发送一次请求,然后更新客户端显示.这种方式实际 ...

  4. 常用js方法封装

    常用js方法封装 var myJs = { /* * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值是格式化的字符串日期 */ getDates: fun ...

  5. 用DLL方式封装MDI子窗体

    用DLL方式封装MDI子窗体是一种常用的软件研发技术,他的长处: 研发人员能够负责某一个模块的编写包括(界面+逻辑),能够互不干扰,模块研发完成后,主程式统一调用. 易于程式升级,当程式升级时,不用编 ...

  6. 十一 三种Struts2的数据封装方式,封装页面传递的数据

    Struts2的数据封装:Struts2是一个web层框架,框架是软件的半成品.提供了数据封装的基本功能. 注:Struts2底层(核心过滤器里面的默认栈里面的拦截器,具体见struts-defaul ...

  7. 用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

    Vue3 的父子组件传值.绑定表单数据.UI库的二次封装.防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法. 基础使用方法 Vue3对于表单的绑定提供了一 ...

  8. jQuery中ajax的4种常用请求方式

    jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数 ...

  9. iOS代码加密常用加密方式

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

随机推荐

  1. easyui_tree 复选框 动态加载树

    controller动态获取单位用户树 #region 下拉树菜单 /// <summary> /// 获取工作人员树菜单 /// </summary> /// <par ...

  2. [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】

    题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...

  3. ESXI转HYPER-V,问题接二连三啊(VMDK转VHD)

    首先说软件: 要不是用SCVMM来转的话,我用得最爽的还是WINIMAGE,自然流畅.其它的都有各种问题. 其次说说配置更改: 如果原ESXI里只有一个硬盘,一切好说,如果里面挂载了两个,甚至三个硬盘 ...

  4. 6.ListView

    Repeater一般只用来展示数据,如果要增删改则用ListView更方便,使用向导(强类型数据)来使用ListView会自动生成很多模板,免去手写模板代码的麻烦,再进行手工调整即可. 首先设定数据源 ...

  5. Hibernate 配置详解(5)

    9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的,使用这个设置可以配置hibernate在做batch-fetch的时候,生成SQL的策略. ...

  6. session和cookie详解2

    http 之session和cookie http://www.cnblogs.com/ForEverKissing/archive/2008/05/23/1205503.html Session简介 ...

  7. POJ-1330--Nearest Common Ancestors(离线LCA)

    LCA离线算法 它需要一次输入所有的询问,然后有根节点开始进行深度优先遍历(DFS),在深度优先遍历的过程中,进行并查集的操作,同时查询询问,返回结果. 题意: 求A ,B两点的最近公共祖先 分析: ...

  8. FFT(快速傅里叶变换):HDU 5307 He is Flying

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8IAAAPeCAIAAABInTQaAAAgAElEQVR4nOy9fZReVXk3vP8ia+HqCy

  9. 未在本地计算机上注册"MSDAORA.1"提供程序

    1.在客户机器上部署数据库的时候老是报这个异常. 分析:因为用的是OleDB这个万能驱动, 连接字符串 Provider=MSDAORA.1;Password=CCIM;User ID=CCIM;Da ...

  10. Book for Opencv

    Upcoming: Learning OpenCV: Computer Vision in C++ with the OpenCV Library The second edition of the ...