热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

retrofitcontentlength为0_Retrofit源码剖析

1概述2使用介绍3流程剖析4源码架构https:square.github.ioretrofithttps:github.comsquareretrofit1概述Retrofit是

e07dab4b3fffcde62f8a6a44e7bd5e72.png
  • 1 概述
  • 2 使用介绍
  • 3 流程剖析
  • 4 源码架构https://square.github.io/retrofit/https://github.com/square/retrofit

1 概述

Retrofit是一个适用于 Android 和 Java 的 HTTP 请求库

底层为 OkHttp 进行网络请求, Gson 进行响应解析

8d1bb40372470d35b12b7d07a47fd38b.png

2 使用介绍

public interface GitHubService {@GET("users/{user}/repos")Call> listRepos(@Path("user") String user);
}Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/")
// .client(getOkHttpClient()).addConverterFactory(GsonConverterFactory.create()).build();GitHubService gitHubService = retrofit.create(GitHubService.class);Call> repos = gitHubService.listRepos("square");repos.enqueue(new Callback>() {@Overridepublic void onResponse(Call> call, Response> response) {}@Overridepublic void onFailure(Call> call, Throwable t) {}});

需要使用 OkHttp 更多的能力,比如怎加 拦截器 则可以构造 OkHttpClient 传递给 Retrofit

举个例子:

private static OkHttpClient getOkHttpClient() {OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@Overridepublic okhttp3.Response intercept(Chain chain) throws IOException {Request request = chain.request().newBuilder().removeHeader("User-Agent")//移除旧的.addHeader("User-Agent", WebSettings.getDefaultUserAgent(app))//添加真正的头部.build();return chain.proceed(request);}}).build();return httpClient;}

3 流程剖析

6d7e68e3a50fd63e99b3458984c2f055.png

core concept 都在图中

大致可以窥见一个 移动端的网络架构

应用层

传输层

接触较多,其他层开发中接触较少

4 源码结构

Retrofit

  • serviceMethodCache
  • callFactory(OkHttpClient)
  • baseUrl
  • converterFactories
  • callAdapterFactories
  • callbackExecutor

HttpServiceMethod

  • RequestFactory
  • callFactory
  • responseConverter

DefaultCallAdapterFactory

  • get() ---> ExecutorCallbackCall
    • callbackExecutor
    • delegate (Call)

GsonConverterFactory

  • gson

OkHttpCall

  • requestFactory
  • args
  • callFactory
  • responseConverter
  • canceled
  • rawCall
  • executed

5 总结

Retrofit 封装了 Http 请求为 Java 接口,通过注解来描述请求

很多设计亮点:

1 更新UI 方法

static final class MainThreadExecutor implements Executor {private final Handler handler = new Handler(Looper.getMainLooper());@Overridepublic void execute(Runnable r) {handler.post(r);}}

2 动态代理

接口 --> 拦截方法调用

Proxy.newProxyInstance(service.getClassLoader(),new Class[] {service},new InvocationHandler() {private final Platform platform = Platform.get();private final Object[] emptyArgs = new Object[0];@Overridepublic @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)throws Throwable {// If the method is a method from Object then defer to normal invocation.if (method.getDeclaringClass() == Object.class) {return method.invoke(this, args);}args = args != null ? args : emptyArgs;return platform.isDefaultMethod(method)? platform.invokeDefaultMethod(method, service, proxy, args): loadServiceMethod(method).invoke(args);}});

3 设计模式

  • 建造器模式 : 连缀表达式,构造函数参数过多考虑
  • 工厂模式
  • 适配器模式 :接受多个 特性 构造一个通用对象
  • 门面模式 : 封装具体实现
  • 观察者模式


推荐阅读
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
author-avatar
双鱼獒主
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有