美文网首页
okhttp的基本使用《4》

okhttp的基本使用《4》

作者: 天空在微笑 | 来源:发表于2018-02-03 11:02 被阅读19次

在线http请求测试服务器

  1. get请求
OkHttpClient client = new OkHttpClient();

  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  response.body().string();
  1. post请求
public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

  OkHttpClient client = new OkHttpClient();

  RequestBody body = RequestBody.create(JSON, json);

  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();

  Response response = client.newCall(request).execute();

 response.body().string();

1.1 创建 OkHttpClient 对象

OkHttpClient  client = new OkHttpClient();
 public OkHttpClient() {
    this(new Builder());
  }
OkHttpClient(Builder builder) {
    this.dispatcher = builder.dispatcher;
    this.proxy = builder.proxy;
    this.protocols = builder.protocols;
    this.connectionSpecs = builder.connectionSpecs;
    this.interceptors = Util.immutableList(builder.interceptors);
    this.networkInterceptors = Util.immutableList(builder.networkInterceptors);
    this.eventListenerFactory = builder.eventListenerFactory;
    this.proxySelector = builder.proxySelector;
    this.cookieJar = builder.cookieJar;
    this.cache = builder.cache;
    this.internalCache = builder.internalCache;
    this.socketFactory = builder.socketFactory;

    boolean isTLS = false;
    for (ConnectionSpec spec : connectionSpecs) {
      isTLS = isTLS || spec.isTls();
    }

    if (builder.sslSocketFactory != null || !isTLS) {
      this.sslSocketFactory = builder.sslSocketFactory;
      this.certificateChainCleaner = builder.certificateChainCleaner;
    } else {
      X509TrustManager trustManager = systemDefaultTrustManager();
      this.sslSocketFactory = systemDefaultSslSocketFactory(trustManager);
      this.certificateChainCleaner = CertificateChainCleaner.get(trustManager);
    }

    this.hostnameVerifier = builder.hostnameVerifier;
    this.certificatePinner = builder.certificatePinner.withCertificateChainCleaner(
        certificateChainCleaner);
    this.proxyAuthenticator = builder.proxyAuthenticator;
    this.authenticator = builder.authenticator;
    this.connectionPool = builder.connectionPool;
    this.dns = builder.dns;
    this.followSslRedirects = builder.followSslRedirects;
    this.followRedirects = builder.followRedirects;
    this.retryOnConnectionFailure = builder.retryOnConnectionFailure;
    this.connectTimeout = builder.connectTimeout;
    this.readTimeout = builder.readTimeout;
    this.writeTimeout = builder.writeTimeout;
    this.pingInterval = builder.pingInterval;

    if (interceptors.contains(null)) {
      throw new IllegalStateException("Null interceptor: " + interceptors);
    }
    if (networkInterceptors.contains(null)) {
      throw new IllegalStateException("Null network interceptor: " + networkInterceptors);
    }
  }

1.2 创建请求

 Request request = new Request.Builder()
      .url(url)
      .build();
 public static class Builder {
    HttpUrl url;
    String method;
    Headers.Builder headers;
    RequestBody body;
    Object tag;

    public Builder() {
      this.method = "GET";
      this.headers = new Headers.Builder();
    }

    Builder(Request request) {
      this.url = request.url;
      this.method = request.method;
      this.body = request.body;
      this.tag = request.tag;
      this.headers = request.headers.newBuilder();
    }

    public Builder url(HttpUrl url) {
      if (url == null) throw new NullPointerException("url == null");
      this.url = url;
      return this;
    }
...
  public Request build() {
      if (url == null) throw new IllegalStateException("url == null");
      return new Request(this);
    }
public final class Request {
  final HttpUrl url;
  final String method;
  final Headers headers;
  final @Nullable RequestBody body;
  final Object tag;

  private volatile CacheControl cacheControl; // Lazily initialized.

  Request(Builder builder) {
    this.url = builder.url;
    this.method = builder.method;
    this.headers = builder.headers.build();
    this.body = builder.body;
    this.tag = builder.tag != null ? builder.tag : this;
  }
...

1.3 创建call

  Response response = client.newCall(request).execute();
 @Override 
public Call newCall(Request request) {
    return RealCall.newRealCall(this, request, false /* for web socket */);
  }
 static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) {
    // Safely publish the Call instance to the EventListener.
    RealCall call = new RealCall(client, originalRequest, forWebSocket);
    call.eventListener = client.eventListenerFactory().create(call);
    return call;
  }

1.4 同步网络请求


  @Override 
public Response execute() throws IOException {
    synchronized (this) {
//检查这个 call 是否已经被执行了,每个 call 只能被执行一次,如果想要一个完全一样的 call,可以利用 call#clone 方法进行克隆。
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    captureCallStackTrace();
    eventListener.callStart(this);
    try {
//利用 client.dispatcher().executed(this) 来进行实际执行,dispatcher 是刚才看到的 OkHttpClient.Builder 的成员之一,它的文档说自己是异步 HTTP 请求的执行策略,现在看来,同步请求它也有掺和
      client.dispatcher().executed(this);
//调用 getResponseWithInterceptorChain() 函数获取 HTTP 返回结果,从函数名可以看出,这一步还会进行一系列“拦截”操作。
      Response result = getResponseWithInterceptorChain();
      if (result == null) throw new IOException("Canceled");
      return result;
    } catch (IOException e) {
//最后还要通知 dispatcher 自己已经执行完毕
      eventListener.callFailed(this, e);
      throw e;
    } finally {
      client.dispatcher().finished(this);
    }
  }

1.5 真正发出网络请求,解析返回结果的 getResponseWithInterceptorChain

 Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    List<Interceptor> interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    interceptors.add(retryAndFollowUpInterceptor);
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    interceptors.add(new CacheInterceptor(client.internalCache()));
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {
      interceptors.addAll(client.networkInterceptors());
    }
    interceptors.add(new CallServerInterceptor(forWebSocket));

    Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
        originalRequest, this, eventListener, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());

    return chain.proceed(originalRequest);
  }

1.5.1 在配置 OkHttpClient 时设置的 interceptors;
1.5.2 负责失败重试以及重定向的RetryAndFollowUpInterceptor;
1.5.3 负责把用户构造的请求转换为发送到服务器的请求、把服务器返回的响应转换为用户友好的响应的 BridgeInterceptor;
1.5.4 负责读取缓存直接返回、更新缓存的 CacheInterceptor;
1.5.5 负责和服务器建立连接的 ConnectInterceptor;
1.5.6 配置 OkHttpClient 时设置的 networkInterceptors;
1.5.7 负责向服务器发送请求数据、从服务器读取响应数据的 CallServerInterceptor。

相关文章

  • okhttp的基本使用《4》

    在线http请求测试服务器 get请求 post请求 1.1 创建 OkHttpClient 对象 1.2 创建请...

  • 通过使用方式逐步理解okhttp源码一

    从okhttp最基本的使用方式解析okhttp okhttp的使用很简单 导入依赖 implementation...

  • OkHttp 3.12.0源码分析

    主要参考文章:1.Okhttp的基本使用2.Okhttp主流程源码分析 Okhttp 3.12.0 使用例子 1、...

  • okhttp1

    okhttp分享一:okhttp基本使用及interceptor链 本文主要内容如下 okhttp 简介okhtt...

  • OKhttp基本使用

    目录 1.Get请求(同步和异步) 2.POST请求表单(key-value) 3.POST请求提交(JSON/S...

  • OkHttp基本使用

    OkHttp介绍 Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClie...

  • OkHttp(1)-OkHttp的基本使用

    本系列文章是对OkHttp的使用、框架封装及源码分析所写。 一、主要内容 1、简介OkHttp 2、介绍OkHtt...

  • OkHttp的基本使用

    前面讲解了Volley网络请求的使用,这章就来看看OkHttp的使用。调用的网址如下: GET同步使用 GET异步...

  • okhttp的基本使用

    Android中volley框架,因为httpclient的问题,不建议使用 基本代码逻辑: 执行post请求的方...

  • Android使用Https

    OkHttp使用Https(OkHttp版本3.8.1) 一、使用(4步搞定) 1.初始化OkHttpClient...

网友评论

      本文标题:okhttp的基本使用《4》

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