OkHttp基本使用教程

简介

android网络请求框架之OkHttp,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,但仍可引入Jar包使用)。
OkHttp是一个高效的HTTP客户端,它有以下默认特性:

  • 允许连接到同一个主机地址的所有请求,提高请求效率
  • 共享Socket,减少对服务器的请求次数
  • 通过连接池,减少了请求延迟
  • 缓存响应数据来减少重复的网络请求
  • 减少了对数据流量的消耗
  • 自动处理GZip压缩

功能:

  • get,post请求
  • 文件的上传和下载
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持
okhttp的使用
1. 异步GET请求
使用步骤:
创建OkHttpClient对象
构造Request对象
通过OkHttpClient和Request对象来构建Call对象
通过Call对象的enqueue(Callback)方法来执行异步请求
String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
    .url(url)
    .get()	//默认就是GET请求,可以省略
    .build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: ");
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
    	//response.body().string() 获得服务器返回的数据
        Log.d(TAG, "onResponse: " + response.body().string());
    }
});
2. 同步GET请求

前面几个步骤和异步方式一样,只是最后一步是通过 Call.execute() 来提交请求,注意这种方式会阻塞调用线程,所以在Android中应放在子线程中执行,否则有可能引起ANR异常,Android3.0 以后已经不允许在主线程访问网络。

String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
        .url(url)
        .build();
final Call call = okHttpClient.newCall(request);
//创建子线程
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Response response = call.execute();
            Log.d(TAG, "run: " + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();
3. POST请求(提交String)

这种方式与前面的区别就是在构造Request对象时,需要多构造一个RequestBody对象,用它来携带我们要提交的数据。在构造 RequestBody 需要指定MediaType,用于描述请求/响应 body 的内容类型。
MediaType指的是要传递的数据的MIME类型,MediaType对象包含了三种信息:type 、subtype以及charset,一般我们会将这些信息传入parse()方法中,这样就可以解析出MediaType对象。如果不知道某种类型数据的MIME类型,可以参见MIME参考手册 较详细的列出了所有数据的MIME类型。

使用步骤:
创建OkHttpClient对象
构造mediaType对象
构造RequestBody对象
通过RequestBody构造Request对象
通过OkHttpClient和Request对象来构建Call对象
通过Call对象的enqueue(Callback)方法来执行异步请求
String url = "http://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
RequestBody requestBody = RequestBody.create(mediaType,"RequestBody");
Request request = new Request.Builder()
    .url(url)
    .post(requestBody)
    .build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
		Log.d(TAG, "onFailure: ");
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: "+response.body().string());
    }
});
4. POST请求(提交表单 key-value参数)

向服务器提交表单时,使用 RequestBody 的实现类FormBody来描述请求体,它可以携带一些经过编码的 key-value 请求体,FromBody用于提交表单键值对(key-value),其作用类似于HTML中的< form >标记。

String url = "http://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
    .add("username",username)
    .add("password",password)
    .build();
Request request = new Request.Builder()
    .url(url)
    .post(requestBody)
    .build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
		Log.d(TAG, "onFailure: ");
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: "+response.body().string());
    }
});
5. POST请求(提交json数据)

使用步骤与POST提交String相同,唯一的区别就是mediaType对象要解析的MIME类型为(“application/json;charset=utf-8”)。

String url = "http://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json;charset=utf-8");
RequestBody requestBody = RequestBody.create(mediaType,jsonData);
Request request = new Request.Builder()
    .url(url)
    .post(requestBody)
    .build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.d(TAG, "onFailure: ");
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        Log.d(TAG, "onResponse: "+response.body().string());
    }
});

官方文档:OkHttp官方文档
参考链接:okhttp3基本使用

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐