浅谈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

 

posted @ 2017-04-09 13:09  CoddingMan  阅读(10259)  评论(0编辑  收藏  举报