美文网首页
重温一遍OkHttp

重温一遍OkHttp

作者: Gunter1993 | 来源:发表于2017-05-03 17:05 被阅读19次

* 版本 3.4.1

为什么使用OkHttp

  • 支持SPDY(基于TCP的协议,多路复用、请求优先级、报头压缩、单个socket处理并发以减少握手)
  • 支持Https,包括自签名请求链接(如支付请求)。
  • 取消请求。
    </br>

基本请求

// client和request都使用builder模式实例化
client.newCall(request).excute() or .enqueue(callback)

</br>

保存Cookie

clientBuilder.cookieJar(new CookieJar(){
    @Override
    public synchronized void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
        // 存(key = url, value = cookies)
    }

    @Override
    public synchronized List<Cookie> loadForRequest(HttpUrl url) {
        // 取(key = url),返回(value = cookies)
    }
});

</br>

打印Log

public class LoggerInterceptor implements Interceptor {
    ...
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        logForRequest(request); // 打印request
        Response response = chain.proceed(request); // 责任链模式,调用proceed处理下一个拦截器
        return logForResponse(response); // 打印response
    }
    ...
}

</br>

上传文件(文件流方式)

客户端代码

RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addPart(Headers.of(
                        "Content-Disposition",
                        "form-data;name=\"myfile\";filename =\"lgt.jpeg\""), fileBody) // 服务端可以通过name值获取到该请求表单,通过filename获取到上传的文件
                .build();
final Request request = new Request.Builder()
                .url(BASE_HOST + url)
                .post(requestBody)
                .build();
Call call = mClient.newCall(request);
call.enqueue(callback);

服务端Python代码(Flask实现)

// 所允许上传的文件类型
@app.route('/api/upload', methods=['POST'], strict_slashes=False)
def api_upload():
    file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])
    if not os.path.exists(file_dir):
        os.makedirs(file_dir)
    f = request.files['myfile']  # 从表单的file字段获取文件,myfile为该表单的name值
    if f and allowed_file(f.filename):  # 判断是否是允许上传的文件类型
        fname = secure_filename(f.filename)
        print(fname)
        ext = fname.rsplit('.', 1)[1]  # 获取文件后缀
        unix_time = int(time.time())
        new_filename = str(unix_time) + '.' + ext  # 修改了上传的文件名
        f.save(os.path.join(file_dir, new_filename))  # 保存文件到upload目录
        return jsonify({"CODE": 200, "MSG": "Upload succeed!"})
    else:
        return jsonify({"CODE": 1001, "MSG": "Your selected upload file type is not allowed!"})

</br>

角色分析

  • OkHttpClient:设置拦截器、cookie、ssl认证、缓存、超时、代理
  • Request:设置url、请求方式(默认get)、cacheControl
  • RealCall:
  • Interceptor:
  • Dispatcher:
  • AsycCall:
    </br>

责任链模式

  1. 实现(任何一种设计模式都没有固定的写法,只有合适的写法 )
  2. 特点
    - 以U型轨道顺序执行
    - 从“原料”到“成品”,我们既可以对“原料”进行“加工”,还可以对“成品”进行“加工”
    - 对修改关闭,对拓展开放
    </br>

源码解析

  1. 网络请求

相关文章

  • 重温一遍OkHttp

    * 版本 3.4.1 为什么使用OkHttp 支持SPDY(基于TCP的协议,多路复用、请求优先级、报头压缩、单个...

  • OkHttp拦截器袖珍重写版

    本篇文章建立在看过一遍OkHttp源码中的拦截器部分的基础上。 OkHttp回顾 OkHttp的拦截器工作原理如下...

  • 摘抄本‖是歌也是诗——《春のかたみ​​​​​​​​​​​​​​​

    又重温了一遍《怪~​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​...

  • 重温一样很有意思

    看完的电影,可以再看一遍。 看过的书,也可以重温一遍。 看过的风景,一样可以重温一遍。 所谓,温故而知新。 所谓,...

  • 【Android知识点总结系列】之OkHttp原理总结

    很久之前看过 OkHttp 的源码,但当时没有做总结,今天突然想在脑海中过一遍OkHttp 内部的执行流程时,发现...

  • 爱吗?一定还很爱

    我在一遍一遍的重温经典《大话西游》,即便剧情我早已烂熟于心,可每次重温之时,仍然会感动,会落泪,会...

  • 无题

    重温了一遍《肖申克的救赎》。

  • 重温一遍《大宅门》

    向来不爱追剧,主要怕第二天熬成熊猫眼,但是最近总是失眠,追不追剧也睡不着,打开视频,翻来看去,没找到自己喜欢的...

  • 重温一遍《沉思录》

    文/陈彩霞 昨晚重温一遍《沉思录》,一抬头就又一个凌晨一点。白天要上班,晚上才有时间读书,毕业后才发现,原来读书的...

  • 没想过你会来,也没想过你会走

    半个月前重温了一遍《奋斗》,两天前重温了一遍《失恋33天》。 像我这种一看剧就要掉眼泪的人,真是不要带我去看《素媛...

网友评论

      本文标题:重温一遍OkHttp

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