okhttp 常用使用方式 封装 演示

工具介绍

使用:
  • 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();     } }

来自为知笔记(Wiz)

附件列表

时间: 2024-07-31 21:08:25

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

Brackets主体及常用插件汉化演示与意见征集

Brackets主体及常用插件汉化演示与意见征集 作者:赵亮-碧海情天(资深C/S和B/S开发与管理) 声明:原创内容.拒绝未授权商业转载,非商业转载须在文前注明原作者及本文原地址. 摘要: 秉持之前个人对于Sublime Text汉化定制的原则和风格,对于Brackets的主体及常用插件进行了汉化,在此提供展示,征集修改意见.反馈较多的话,再上传汉化包并通过编辑给本文添加下载地址. 先回答有什么必要阅读本文 Brackets应该可以被评价为一个非常亮丽出色的前端代码编辑器软件,如果没有先接触S

常用js方法封装

常用js方法封装 var myJs = { /* * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值是格式化的字符串日期 */ getDates: function(dt) { var str = ""; //存储时间的字符串 //获取年 var year = dt.getFullYear(); //获取月 var month = dt.getMonth() + 1; //获取日 var day = dt.getDate(); //获取小时

step by step教你常用JS方法封装(一) [ 大杂烩 ]

本文参考原文-http://bjbsair.com/2020-03-25/tech-info/6338/ 持续更新中... 常用JS方法封装方法预告: 项目常用JS方法封装(二) [ 时间处理 ] 项目常用JS方法封装(三) [ 字符串相关处理 ] 项目常用JS方法封装(四) [ 数组相关处理 ] 使用方法非常简单,只需放到你的 utils.js 工具文件中,直接 export const 加上我的封装方法,在别的文件中使用{方法1,方法2,方法3...}引用后就可以直接使用了! 001.输入一

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

从本篇文章开始,我将会陆续介绍提高 VS 开发效率的文章,欢迎大家补充~ 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以只用键盘来完成,那开发效率将得到大幅度的提升.因此,灵活地应用 Visual Studio 的键盘快捷键,就可以起到事半功倍的地步. 为了便于日后查看,我根据使用的效果分成这么几块:代码编辑.查找与替换.代码美化.代码导航.Visual Studio 窗口和调试.同时,在参考了资源[2]的文章后,发

iOS代码加密常用加密方式

在今天的面试中,被问到了iOS是采用什么进行加密解密操作的,我的回答是这样的:AES,MD5,Base 64,然后是对这几种加密算法进行了一下简单的介绍和概述和几种算法之间的不同点和优缺点.然而,收到的回答是:这些都不是iOS的加密!我顿时就无语了,这不就是iOS加密所用到的方法么?然后向面试官请教了一下:MD5是一种摘要....什么叫加密呢?加密是客户端对数据加密和服务器端采用秘钥对数据进行解密处理,为了数据的安全考虑.要说加密应该是RSA.幸亏之前有了解过RSA,只是了解的不是很彻底和清楚.

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

jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息.详细参数选项见下. 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml"). 实例: 保存数据到服务器,成功时显示信息. $.ajax({ type: "post", dataType: "

python-django-ORM,常用查询方式

介绍django model 的一些常用查询方式 首先是一些文档性的帮助 __exact 精确等于 like ‘aaa’ __iexact 精确等于 忽略大小写 ilike ‘aaa’ __contains 包含 like ‘%aaa%’ __icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains. __gt 大于 __gte 大于等于 __lt 小于 __lte 小于等于 __in 存在于一个list范围内

iOS——常用加密方式

iOS代码加密常用加密方式,常见的iOS代码加密算法包括MD5加密.AES加密.BASE64加密. 三大算法iOS代码加密是如何进行加密的: /////////////////////////////////////////////////////////////////// MD5 iOS代码加密使用方法 /////////////////////////////////////////////////////////////////// //创建MD5类,代码如下 #import <Foun

Android TableLayout 常用的属性介绍及演示

TableLayout经常用的属性是: 1.android:collapseColumns:以第0行为序,隐藏指定的列:把android:collapseColumns=0,2 意思是把第0和第2列隐藏 2.android:shrinkColumns:以第0行为序,自动延伸指定的列填充可用部分:当LayoutRow里面的控件还没有布满布局 时,shrinkColumns不起作用,设置了shrinkColumns=0,1,2,布局完全没有改变,因为LayoutRow里面还剩足够的空 间.当Layo