Android实战----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的

别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Android实战----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的相关的知识,希望能为你提供帮助。
一、简介
接上一篇【Android实战】----基于Retrofit实现多图片/文件、图文上传 中曾说非常想搞明白为什么Retrofit那么屌。最近也看了一些其源码分析的文章以及亲自查看了源码, 发现其对java网络编程及HTTP权威指南有了一个很好的诠释。一直以来, 都信奉一个原则, 在这个新技术日新月异的时代, 如何在Java界立足, 凭借的就两点:
1、基本功, 包括: Java基本知识, ( Java编程思想、Effective Java) , Java进阶( Java虚拟机、Java设计模式) 、网络相关( 这个时代没有网络就没有一切, Java网络编程、HTTP权威指南、TCP/IP协议) , 计算机系统相关( 编译原理、深入理解计算机系统等) 这些都是根本, 所谓万变不离其宗, 在掌握这些基本功的基础上, 再学习新技术, 面对日新月异的新技术时就会游刃有余。
2、将琐碎知识串联起来的能力, 也就是归纳总结能力。无论是在工作中还是学习中, 起初用到的知识是东一块、西一块, 其实许多东西都是关联的, 通过系统的梳理形成自己的知识体系, 打造属于自己的专属领域, 这也是在Java界立足的根本。
【Android实战----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的】以上这些纯属自己这段时间的瞎想胡扯, 大家共勉。
二、Retrofit简介
可参见Jake Wharton的演讲https://realm.io/cn/news/droidcon-jake-wharton-simple-http-retrofit-2/
retrofit是由square公司开发的。square在github上发布了很多优秀的Android开源项目。例如:otto(事件总线),leakcanary(排查内存泄露),android-times-square(日历控件),dagger(依赖注入),picasso(异步加载图片),okhttp(网络请求),retrofit(网络请求)等等。更多square上的开源项目我们可以去square的GitHub进行查看。

根据Retrofit的官方文档( https://github.com/square/retrofit及http://square.github.io/retrofit/) 看Retrofit是

A type-safe HTTP client for android and Java


可见Retrofit可以应用到Android平台和Java平台中, 其源码中也可看出retrofit2\\Platform.java
private static Platform findPlatform() { try { Class.forName(" android.os.Build" ); if (Build.VERSION.SDK_INT != 0) { return new Android(); } } catch (ClassNotFoundException ignored) { } try { Class.forName(" java.util.Optional" ); return new Java8(); } catch (ClassNotFoundException ignored) { } try { Class.forName(" org.robovm.apple.foundation.NSObject" ); return new ios(); } catch (ClassNotFoundException ignored) { } return new Platform(); }

可见可以应用在Android、Java8及IOS平台中, 当然在IOS中要基于RoboVM。RoboVM它是一种可以在iOS设备上运行Java应用程序的技术, 这种技术主要还是用于在游戏开发中。
Retrofit简化了从Web API下载数据, 解析成普通的Java对象( POJO) 。
Retrofit重要的一点是应用了Java中的动态代理机制http://blog.csdn.net/honghailiang888/article/details/50619545, 有必要好好研究下:

/** * Create an implementation of the API endpoints defined by the {@ code service} interface. * < p> * The relative path for a given method is obtained from an annotation on the method describing * the request type. The built-in methods are {@ link retrofit2.http.GET GET}, * {@ link retrofit2.http.PUT PUT}, {@ link retrofit2.http.POST POST}, {@ link retrofit2.http.PATCH * PATCH}, {@ link retrofit2.http.HEAD HEAD}, {@ link retrofit2.http.DELETE DELETE} and * {@ link retrofit2.http.OPTIONS OPTIONS}. You can use a custom HTTP method with * {@ link HTTP @ HTTP}. For a dynamic URL, omit the path on the annotation and annotate the first * parameter with {@ link Url @ Url}. * < p> * Method parameters can be used to replace parts of the URL by annotating them with * {@ link retrofit2.http.Path @ Path}. Replacement sections are denoted by an identifier * surrounded by curly braces (e.g., " {foo}" ). To add items to the query string of a URL use * {@ link retrofit2.http.Query @ Query}. * < p> * The body of a request is denoted by the {@ link retrofit2.http.Body @ Body} annotation. The * object will be converted to request representation by one of the {@ link Converter.Factory} * instances. A {@ link RequestBody} can also be used for a raw representation. * < p> * Alternative request body formats are supported by method annotations and corresponding * parameter annotations: * < ul> * < li> {@ link retrofit2.http.FormUrlEncoded @ FormUrlEncoded} - Form-encoded data with key-value * pairs specified by the {@ link retrofit2.http.Field @ Field} parameter annotation. * < li> {@ link retrofit2.http.Multipart @ Multipart} - RFC 2388-compliant multipart data with * parts specified by the {@ link retrofit2.http.Part @ Part} parameter annotation. * < /ul> * < p> * Additional static headers can be added for an endpoint using the * {@ link retrofit2.http.Headers @ Headers} method annotation. For per-request control over a * header annotate a parameter with {@ link Header @ Header}. * < p> * By default, methods return a {@ link Call} which represents the HTTP request. The generic * parameter of the call is the response body type and will be converted by one of the * {@ link Converter.Factory} instances. {@ link ResponseBody} can also be used for a raw * representation. {@ link Void} can be used if you do not care about the body contents. * < p> * For example: * < pre> * public interface CategoryService { *@ POST(" category/{cat}/" ) *Call< List< Item> > categoryList(@ Path(" cat" ) String a, @ Query(" page" ) int b); * } * < /pre> */ @ SuppressWarnings(" unchecked" ) // Single-interface proxy creation guarded by parameter safety. public < T> T create(final Class< T> service) { Utils.validateServiceInterface(service); if (validateEagerly) { eagerlyValidateMethods(service); } return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class< ?> [] { service }, new InvocationHandler() { private final Platform platform = Platform.get(); @ Override public Object invoke(Object proxy, Method method, 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); } if (platform.isDefaultMethod(method)) { return platform.invokeDefaultMethod(method, service, proxy, args); } ServiceMethod serviceMethod = loadServiceMethod(method); OkHttpCall okHttpCall = new OkHttpCall< > (serviceMethod, args); return serviceMethod.callAdapter.adapt(okHttpCall); } }); }







Retrofit依赖于OkHttp, 最终的请求响应是在OkHttp中做的, 性能之所以高, 也是因为okHttp的性能高。
三、OkHttp简介
android网络框架之OKhttp是一个处理网络请求的开源项目, 是安卓端最火热的轻量级框架,由移动支付 Square公司贡献 , 用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)。

    推荐阅读