澳门美高梅手机网站至于Interceptor

什么是Interceptor:

Interceptor翻译过来就拦截器,它是OkHttp网络要被抓取请求和响应必须的一个全能王。

你若用了okhttp,一定对HttpLoggingInterceptor不生,这多少个是squareup集团写的一个则,其实它也吗即是语你了别样你想将到之数据。看源码么,go。。。

public final class HttpLoggingInterceptor implements Interceptor {
  private static final Charset UTF8 = Charset.forName("UTF-8");
//设置拦截级别,枚举4种
  public enum Level {
    NONE,
    BASIC,
    HEADERS,
    BODY
  }
。。。。。。。。。。
。。。。。。。。。。
。。。。。。。。。。
  @Override public Response intercept(Chain chain) throws IOException {
    Level level = this.level;
    Request request = chain.request();
    if (level == Level.NONE) {
      //不拦截,直接返回
      return chain.proceed(request);
    }
    boolean logBody = level == Level.BODY;
    boolean logHeaders = logBody || level == Level.HEADERS;
    RequestBody requestBody = request.body();
    boolean hasRequestBody = requestBody != null;
    //建立连接
    Connection connection = chain.connection();
    //拿到连接协议,如果连接不存在就直接用http_1_1协议
    Protocol protocol = connection != null ? connection.protocol() : Protocol.HTTP_1_1;
    String requestStartMessage = "--> " + request.method() + ' ' + request.url() + ' ' + protocol;
    //如果设置的级别是base,就打印头部分
    if (!logHeaders && hasRequestBody) {
      requestStartMessage += " (" + requestBody.contentLength() + "-byte body)";
    }
    logger.log(requestStartMessage);
    //如果设置的级别是头,就打印头部分
    if (logHeaders) {
      //如果有请求体,就将请求体的长度和类型打印
      if (hasRequestBody) {
        //请求头的值,存在就拦截
        if (requestBody.contentType() != null) {
          logger.log("Content-Type: " + requestBody.contentType());
        }
        //-1代表请求数据长度0
        if (requestBody.contentLength() != -1) {
          logger.log("Content-Length: " + requestBody.contentLength());
        }
      }
      //请求头部分,遍历打印
      Headers headers = request.headers();
      for (int i = 0, count = headers.size(); i < count; i++) {
        String name = headers.name(i);
        // 这里因为上面已经打印了,所以就过滤一下
        if (!"Content-Type".equalsIgnoreCase(name) && !"Content-Length".equalsIgnoreCase(name)) {
          logger.log(name + ": " + headers.value(i));
        }
      }
      //没有请求体,或者等级没有设置为打印请求体,结束打印
      if (!logBody || !hasRequestBody) {
        logger.log("--> END " + request.method());
      } else if (bodyEncoded(request.headers())) {
        //有请求体或者log等级设置为body,打印请求头中设置的编码
        logger.log("--> END " + request.method() + " (encoded body omitted)");
      } else {
        //将请求体数据给写进缓存流
        Buffer buffer = new Buffer();
        requestBody.writeTo(buffer);
        //设置编码为utf-8
        Charset charset = UTF8;
        MediaType contentType = requestBody.contentType();
        if (contentType != null) {
          charset = contentType.charset(UTF8);
        }

        logger.log("");
      //判断是否是人类可读的字符,是就打印
        if (isPlaintext(buffer)) {
          logger.log(buffer.readString(charset));
          logger.log("--> END " + request.method()
              + " (" + requestBody.contentLength() + "-byte body)");
        } else {
          //人类不懂,就用二进制读出来
          logger.log("--> END " + request.method() + " (binary "
              + requestBody.contentLength() + "-byte body omitted)");
        }
      }
    }

    long startNs = System.nanoTime();
    Response response;
    try {
      //请求开始
      response = chain.proceed(request);
    } catch (Exception e) {
      //请求异常
      logger.log("<-- HTTP FAILED: " + e);
      throw e;
    }
    //请求花费时间
    long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
    //响应体了
    ResponseBody responseBody = response.body();
    long contentLength = responseBody.contentLength();
    String bodySize = contentLength != -1 ? contentLength + "-byte" : "unknown-length";
    //打印长度和响应码,响应信息,响应体对应请求体(这里要考虑重定向url),请求耗费时间,响应体长度
    logger.log("<-- " + response.code() + ' ' + response.message() + ' '
        + response.request().url() + " (" + tookMs + "ms" + (!logHeaders ? ", "
        + bodySize + " body" : "") + ')');
    //打印响应头
    if (logHeaders) {
      Headers headers = response.headers();
      for (int i = 0, count = headers.size(); i < count; i++) {
        logger.log(headers.name(i) + ": " + headers.value(i));
      }
       //响应体不存在,等级不为body
      if (!logBody || !HttpHeaders.hasBody(response)) {
        logger.log("<-- END HTTP");
      } else if (bodyEncoded(response.headers())) {
        //响应体编码不对称
        logger.log("<-- END HTTP (encoded body omitted)");
      } else {
        //source,响应体来了
        BufferedSource source = responseBody.source();
        //设置最大缓存大小,当然是缓存整个body喽,全吃
        source.request(Long.MAX_VALUE); 
        Buffer buffer = source.buffer();
        Charset charset = UTF8;
        //拿到media类型对应的字符集
        MediaType contentType = responseBody.contentType();
        if (contentType != null) {
          try {
            charset = contentType.charset(UTF8);
          } catch (UnsupportedCharsetException e) {
            logger.log("");
            logger.log("Couldn't decode the response body; charset is likely malformed.");
            logger.log("<-- END HTTP");

            return response;
          }
        }
        //如果不是人类能看懂的,就不打印string形式的喽
        if (!isPlaintext(buffer)) {
          logger.log("");
          logger.log("<-- END HTTP (binary " + buffer.size() + "-byte body omitted)");
          return response;
        }
        //是人类懂的,就开始读string喽
        if (contentLength != 0) {
          logger.log("");
          logger.log(buffer.clone().readString(charset));
        }
        //最后打印body的长度
        logger.log("<-- END HTTP (" + buffer.size() + "-byte body)");
      }
    }

    return response;
  }

  /**
   *判断缓存流的数据是否是人类能读懂的,哈哈,也就是abc123呗
   */
  static boolean isPlaintext(Buffer buffer) {
     //先判断是不是123abc能看懂的
    try {
      Buffer prefix = new Buffer();
      long byteCount = buffer.size() < 64 ? buffer.size() : 64;
      buffer.copyTo(prefix, 0, byteCount);
      for (int i = 0; i < 16; i++) {
        if (prefix.exhausted()) {
          break;
        }
        //再判断是不是iso8859-1之类的,当然不是能懂的啊
        int codePoint = prefix.readUtf8CodePoint();
        if (Character.isISOControl(codePoint) && !Character.isWhitespace(codePoint)) {
          return false;
        }
      }
      return true;
    } catch (EOFException e) {
      return false; // Truncated UTF-8 sequence.
    }
  }
  //返回头中的编码是否存在并且不是identity,一般都是gzip,deflate,compress之中一个
  private boolean bodyEncoded(Headers headers) {
    String contentEncoding = headers.get("Content-Encoding");
    return contentEncoding != null && !contentEncoding.equalsIgnoreCase("identity");
  }
}

好了算撸了同一通源码,相信还有很多朋友没有扣精晓,解释这多少个源码干嘛呀,此外推荐一首小说,大家跳去看吧(感谢ychongjie的拦截器细致分析):
链接直通车

从未有过尽多日子更新与掩护,有什么不妥的要指出,匆忙的果实,毕竟公司集团项目而免开其别人多开,多少有接触坑队友,dota骨灰级玩家怎么可以做出这种工作吗,不期更新中。。。

过多时看音讯,各行各业的总人口且晤面发协调的赏识,或者说是“迷信”,足球即门员上场时肯定假若戴自己幸运色的手套,赌博的人以上桌后定如若选好嗜的地点,诸如此类各样。

自身当测验的时,也总会发出这种迷信,相信“考运”这种工作的存在,比如大考往日若连北几筋斗dota,这肯定是信心百倍,觉得有的气数还置身了试上,大得放心上考场,假如“不巧”的并赢了好几局,这心里就是会当大大的次,觉得运气还为此完了,万事大凶。

陈奕迅在歌里说,“在老年能碰到你,定是消费只了自家所有运气”,深以为然,运气就是守恒的嘛,这里来了这里就是不会见来了,要主动操控运气啊时候来。

乃从头协调雕刻,比如说在大考往日卸载游戏,不给好“消费”运气的空子,或是一定如若由到北几旋转,才会让人满意的安静睡去,觉得运气肯定会于产一刻来临。这种做法直接至今,有好啊来至极,但大惊喜,往往是好得几近,坏的少。也便径直重复坚毅了上下一心的想法,万事都起“天注定”,打并每人皆由命。

可挨着几龙,却死是打击了一致不行,在提到人生转折上的同等不善考试折戟沉沙,痛定思痛,把温馨之题目归结为考前并过了五六牵扯满面红光消消乐上。

乃决定下次考试前必定不玩心花怒放消消乐,报定了此念头的本人,在当下吧丝毫从未发现及是动机是何其的错误。

而是当返家之旅途突然惊醒了,我的人生,难道真的是由于dota、心潮澎湃消消乐那多少个来决定的啊,假使真的来天意守稳定律,这是休是dota职业运动员每便由大赛前若列席同一不善高考?

明明不是,于是终于知道,运气,只是体弱的借口,想只要负不测,就不可能不产生相逢意外的身份。

考试考的好,可能是为当就准备充足,因为考前以保运气,把打删除了,给了温馨丰富的备选时间,而考试的糟糕,多半是出于拿心情到消费在了另外方面,对成紧缺破釜沉舟的胆子。

及运气,或许真正没啊关联 。

顷查了下音讯,把信运气真是成功要素的,多半是来未有名的球员,行家,真真厉害的左侧,倒挺少取这一个,花边音信说乔丹(乔丹(Jordan)),总是好过同长内裤上,但是大家评论起乔丹(Jordan),相信都未会面提起三角裤就茬,这个“迷信”,也只好上只洋,像足球界的c罗、Messi,可能大少会拿命挂住嘴边,行就是行,不行就非凡。

回想搭后的本人,犹如豁然开朗,总想方“运气守稳”,来收获意外得到,显明就是是瞎猫碰上死耗子,多半成不了。回顾那么些成功的过去。多半可能要坐准备充足,而休是空泛的命运。

兴许未来,应当坚决不信任所谓的“运气”了,假使无充足努力,就连中见意外收获的机还未曾。一味的要运气来博出人意料拿到,绝大部分人口进彩票大概就是是者思想。

不过今吓哪,因为自身思搭了。

从现在起,从我做起。

产一个转速,就于头里等正我,下一样破,我弗思着命局,努力走近。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website