zoukankan      html  css  js  c++  java
  • 浅谈Android studio中OKHttp安装及简单使用

    Google貌似在6.0版本里面删除了HttpClient相关API,鉴于okhttp的口碑相当好,介绍一下OKHttp的安装及使用:

    一.安装

    对于Android Studio的用户,在Project Structure--->Dependencies 点击“+”号选Library dependency在搜索页面分别搜okttp,okio
    注:okhttp内部依赖okio,别忘了同时导入okio
     
     

    二.用法

    (一)Http Get  Http Post 

    //创建okHttpClient对象,设置超时

    1 OkHttpClient mOKHttpClient = new OkHttpClient.Builder()
    2         .connectTimeout(10, TimeUnit.SECONDS)
    3         .readTimeout(10, TimeUnit.SECONDS)
    4         .build();


    get、post请求除了请求体和请求方法不同,其他设置是相同的

    首先说一下2.x到3.x关于POST请求的请求体类的改变:

    在2.x中是 类名是:FormEncodingBuilder() 

    使用FormEncodingBuilder builder = new FormEncodingBuilder();  
    builder.add("username","name");

    在3.x中是 类名是: FormBody,但是一般使用是 RequestBody requestBodyPost = new FormBody.Builder()

    需要说明一下FormBody是RequestBody的子类

     本文采用3.x版本

    1 //    请求参数:page=1&code=news&pageSize=20&parentid=0&type=1
    2                 RequestBody requestBodyPost = new FormBody.Builder()
    3                         .add("page", "1")
    4                         .add("code", "news")
    5                         .add("pageSize", "20")
    6                         .add("parentid", "0")
    7                         .add("type", "1")
    8                         .build();

     默认请求方法是get方法,.get()可以省略

    1 Request request = new Request.Builder()
    2                         .get()
    3                         .url(GET_URL)
    4                         .build();
    5 Request requestPost = new Request.Builder()
    6                         .url(POST_URL)
    7                         .post(requestBodyPost)
    8                         .build();

    然后通过request的对象去构造得到一个Call对象

     1 //new call
     2 Call call = mOkHttpClient.newCall(request); 
     3 //请求加入调度
     4 call.enqueue(new Callback()
     5         {
     6             @Override
     7             public void onFailure(Request request, IOException e)
     8             {
     9             }
    10 
    11             @Override
    12             public void onResponse(final Response response) throws IOException
    13             {
    14                     //String htmlStr =  response.body().string();
    15             }
    16         });             

    需要注意几点:

    • onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()

    • onResponse执行的线程并不是UI线程,如果你希望操作控件,还是需要使用handler,runOnUiThread等操作ui

    (二)基于Http的文件上传

    上传文件和一般的带参数post请求不同之处在于RequestBody的构建

    RequestBody的Builder和type因版本而已,2.x叫做MultipartBuilder,3.x叫做MultipartBody.Builder()。当我们需要做类似于表单上传的时候,就可以使用它来构造我们的requestBody。此处以3.x为例

     1 File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
     2 if (!file.exists()) {
     3                     Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();
     4                 } else {
     5 RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
     6 /* 2.x版本
     7 RequestBody requestBody = new MultipartBuilder()
     8          .type(MultipartBuilder.FORM)*/
     9 RequestBody requestBody = new MultipartBody.Builder()
    10         .setType(MultipartBody.FORM)
    11      .addPart(Headers.of(
    12           "Content-Disposition", 
    13               "form-data; name="username""), 
    14           RequestBody.create(null, "cxc"))
    15     /* .addPart(Headers.of(
    16          "Content-Disposition", 
    17          "form-data; name="mFile"; 
    18          filename="wjd.mp4""), fileBody)*/
    19 .addFormDataPart("mFile", file.getName(), fileBody)
    20 .addFormDataPart("thumb", file.getName(),
    21                 RequestBody.create(MediaType.parse("image/*"), file));
    22 //添加其他参数
    23 .addFormDataPart(key, value);
    24      .build();
    25 ·····}

    说明:

    提交json数据,MediaType.parse("application/json; charset=utf-8")

    上传图片,MediaType.parse("image/*");

    提交String,MediaType.parse("text/x-markdown; charset=utf-8")

    上传文件,MediaType.parse("application/octet-stream")

    addPart和addFormDataPart方法本质是一样的

    通过上面设置上传图片,MP3,小的文件都没问题。

    本文为博主原创文章,请尊重版权,未经博主允许不得转载,转载请注明出处:http://www.cnblogs.com/details-666/p/OKHttp.html

    带有进度监听的上传下载请参考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0904/3416.html

  • 相关阅读:
    线段树、树状数组
    贪心算法(Fatmouse’Trade、今年暑假不AC)
    搜索+DP专题(背包问题、N个数选K个使平方和最大且和为X、divide by three, multiple by two、全排列、组合、N皇后、jugs、掉石头迷宫、斐波那契、最大连续子序列和、最长上升子序列、非常可乐、导弹拦截系统:最长不降子序列)
    计算机考研机试指南(九)——搜索(百鸡问题、ABC、胜利大逃亡、迷宫问题、C翻转、旋转矩阵、字符串匹配、)
    计算机考研机试指南(八)——图论(畅通工程、还是畅通工程、最短路、more is better、Freckles、legal or not、确定比赛名次、产生冠军、最短路径问题)
    String与StringBuffer与StringBuilder
    replace into
    eclipse迅速新建main函数
    数据库视图什么时候需要用到
    springboot实现拦截器
  • 原文地址:https://www.cnblogs.com/details-666/p/OKHttp.html
Copyright © 2011-2022 走看看