Android网络

OkHttp(一)入门

2019-06-26  本文已影响0人  LLLLLin0

For:能够通过OkHttp发送请求并处理响应

简单介绍OkHttp的使用

private void sendGet() {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url("https://www.baidu.com").get().build();
        Call call = client.newCall(request);
        try {
            Response response = call.execute();
            String string = response.body().string();
            Log.i(TAG, "body:" + string);
            response.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  1. 实例化OkHttpClient对象
  2. 构建Request请求体
  3. 通过client生成Call对象
  4. 通过Call对象发送同步或异步请求,获得响应体Response
  5. 读取数据

OkHttp相关类解析

OkHttpClient

  1. 提供默认的构造器,一般封装成一个单例对象,所有请求共享。
  2. OkHttpClient.Builder可以设置客户端的属性
    (1)超时
    (2)拦截器

Request

通过Request.Builder连缀请求信息与请求参数,创建Request

Request.Builder常用方法:
public Builder url(String url)

url()方法支持传入的参数有:String、URL、HttpUrl。最后统一封装为HttpUrl。

public Builder method(String method, @Nullable RequestBody body)

常用的HTTP请求如:get()、post()、put()、delete()...都是调用了method方法

public Builder header(String name, String value)
public Builder addHeader(String name, String value)

设置Header头,header()方法会覆盖值,addHeader可以添加多个值

常见Header:

发送Post请求或者Put请求需要RequestBody
#RequestBody.Builder
public static RequestBody create(@Nullable MediaType contentType, String content)

最常见的MediaType即:application/json。
其他还有:text/plain、application/xml等

#MediaType
public static MediaType parse(String string)

构建一个GET请求(默认)

Request request = Request.Builder()
    .url("https://www.baidu.com")
    .header("User-Agent", "OkHttp Headers.java")
    .addHeader("Accept", "application/json")
    .addHeader("Accept", "application/vnd.github.v3+json")
    .build();

构建一个POST请求

MediaType mediaType = MediaType.parse("application/json");
RequestBody requestBody = RequestBody.create(mediaType, jsonString);
Request request = Request.Builder()
    .url("https://www.baidu.com")
    .post(requestBody)
    .build();

通过Request,可以设置url中的path参数、query参数,请求体body,请求首部Header,请求方法

Call

首先,得到Call对象

Call call = client.newCall(request);

之后,可以通过Call来发送同步请求或异步请求

同步请求
Response execute() throws IOException;
  1. 需要在子线程中调用,在主线程中调用会抛异常
  2. 会阻塞当前线程(即发送网络请求的子线程)
  3. 使用完Response后需要close()以避免内存泄露
  4. 一个Call对象只能执行一次,否则会抛出运行异常
  5. 由于超时、取消等情况会抛出IOException
异步请求
void enqueue(Callback responseCallback);
call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });
  1. 传入回调,在异常情况(超时、取消)下回调onFailure(),成功则回调onResponse(),之后可读取参数Response
  2. 可以在主线程调用,不会阻塞线程,回调将在子线程中进行

Response

可以通过Response获得HTTP响应中的信息

public int code()
public String message()
public Headers headers()
public ResponseBody body()
ResponseBody
  1. 当响应数据量较小时:
public final String string()

可以获得返回的字符串,

public final byte[] bytes()

可以获得二进制字节数组

  1. 数据量大时:
public final InputStream byteStream()

可以获得流

  1. 获得数据类型以及长度
public MediaType contentType()
public long contentLength()

contentType可以表明返回string的类型
contentLength是字节数

上一篇 下一篇

猜你喜欢

热点阅读