OkHttp(一)入门

作者: LLLLLin0 | 来源:发表于2019-06-26 01:12 被阅读0次
    • 简单介绍OkHttp的使用
    • OkHttp相关类解析

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

    简单介绍OkHttp的使用

    • 简单的发送GET请求的demo
    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常用方法:
    • url()
    public Builder url(String url)
    

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

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

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

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

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

    常见Header:

    • User-Agent
    • Cookie
    • Accept
    发送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是字节数

    相关文章

      网友评论

        本文标题:OkHttp(一)入门

        本文链接:https://www.haomeiwen.com/subject/nmyfcctx.html