安卓中高级面试知识点之——HTTP相关知识(下)

简介: 以rxjava2+retrofit2+okhttp3为例,通常我们在进行网络封装的时候,有这几个地方需要封装:public T execute(Class clazz) {        OkHttpClient.

以rxjava2+retrofit2+okhttp3为例,通常我们在进行网络封装的时候,有这几个地方需要封装:


public <T>T execute(Class<T> clazz) {

        OkHttpClient.Builder builder =

new OkHttpClient.Builder();


builder.cache(cache);

//       //添加缓存拦截器

        builder.interceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);


builder.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);


//添加拦截器

        builder.interceptors().add(new AddHeaderInterceptor());


builder.interceptors().add(new AddCookiesInterceptor());


builder.interceptors().add(new ReceivedCookiesInterceptor());


builder.interceptors().add(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));


//超时设置

        builder.writeTimeout(DEFAULT_WRITE_TIMEOUT, TimeUnit.SECONDS);


builder.readTimeout(DEFAULT_READ_TIMEOUT, TimeUnit.SECONDS);


builder.connectTimeout(DEFAULT_CONNECT_TIMEOUT, TimeUnit.SECONDS);


OkHttpClient client = builder.build();


Retrofit.Builder rbuilder = new Retrofit.Builder();


rbuilder.baseUrl(SERVER);


rbuilder.addConverterFactory(MiaConverterFactory.create());


rbuilder.addCallAdapterFactory(RxJavaCallAdapterFactory.create());


rbuilder.client(client);


Retrofit retrofit = rbuilder.build();

        return

retrofit.create(clazz);


}


上文的这个方法我是我封装的其中一个。我们以这个举例,说说http的知识点

img_1c8a7ee8aa275474406a055ff6dee6d7.png

上图中,标1的地方,就是要给的http的URL。

我们以这个为例,注释中的和下文的都一个相同的。无非一个是IP地址。

//    public static String SERVER ="http://mia.ijiebao.com:8080/";


public static String SERVER = "http:// 127.0.0.1:8888/";

这里的1处,baseUrl(),给的参数就是http的请求行。(你们自己的服务器的IP地址)


同时我们会专门建一个类,来写消息报头的。比如

@POST("miaapi/sw/login.ashx")

Observable

login(@Body LoginReq json);

这里post后面括号里的就是http的中间部分——消息报头

而下面的@body就是请求正文。需要你上传的数据。这里我用的body,其实有很多个字段方法,可以用。不同的内容需要的请求体的内容也不一样。这个自己百度查,具体怎么用。


这就是http的三部分,上一篇博文说的:请求行、消息报头、请求正文。

如下:就是一个不需要你上传请求正文的http请求。

http://127.0.0.1:8888/v1/chain/get_info


我们再看最上图标注2 的地方,rbuilder.addConverterFactory(MiaConverterFactory.create());

大家会发现,在添加工厂类的时候我用了一个大家没有见过的工厂类。其实这里就是我自己定一个了一个工厂类,当然很多人用的是retorfit本身提供的工厂类。由于我这的返回有gson对象的,有不是gson对象的,有有字段的,有连字段都没有的返回(常见跟硬件端的接口,无对象,无返回字段)。所以只需自己做一个容错处理就可以了。这里根据自己的需求。

如果都是标准gson返回对象,那么就直接用retorfit封装好的Converter.Factory就可以了。

如果需要自定义,那么只需做一个继承,然后重新该类的方法,然后再自定义自己的返回接受形式就可以了。

public final class MiaConverterFactory extends Converter.Factory



我们再看图中标准3的地方

rbuilder.addCallAdapterFactory(RxJavaCallAdapterFactory.create());

这里我用的rxjava1.。用rxjava2的,这里多一个2,如下

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())


继续看,有一个rbuilder.client(client);

这里的client,怎么来呢?

OkHttpClient client

= builder.build();

即可。那builder,这个变量又是什么呢?


img_ea482a0b24c683f0e1f6a08489e98be5.png

这就是网络请求的 http的主要部分的封装。


大家注意我的泛型

public <T>T execute(Class<T> clazz)

以及return的值

return retrofit.create(clazz);

为什么这么做呢?为了方便管理做的一个基类。因为很多网络接口API,我不是所有的都写在一个类里面,我会根据性能分好几个类来写,这样不同性能的接口。我第一时间就能找到。所以,我做了容错处理,这里你也可以直接给死成你的APIserver的网络接口。


关于返回值的封装,以及返回值的状态的onerror处理,我就不再这里本文说了。直接上一个的demo吧。Demo的百度网盘地址和密码如下:


链接:https://pan.baidu.com/s/1A8H-4ftMsOELZ_A7q9xWiw 密码:cn9e

因为http,网络封装的知识非常多,非常深。我就暂时写到这里。更多关于http的交流和探讨,欢迎加我的扣扣:578161213.我们具体再深入细致的交流这个方面的问题。


备注:文字抛的两个问题,是面试官非常喜欢问的奥。希望你能有准备。

相关文章
|
1月前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
68 2
|
1月前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
124 2
|
1月前
|
XML 分布式计算 监控
Oozie工作流管理系统设计与实践:面试经验与必备知识点解析
【4月更文挑战第9天】本文详述了Oozie工作流管理系统的核心概念,包括安装配置、Workflow XML、Action、Coordinator和Bundle XML定义。此外,讨论了工作流设计实践,如监控调试、自动化运维,并对比了Oozie与其他工作流工具的差异。文中还分享了面试经验及解决实际项目挑战的方法,同时展望了Oozie的未来发展趋势。通过学习,读者能提升Oozie技术能力,为面试做好充分准备。
32 0
|
1月前
|
数据采集 消息中间件 监控
Flume数据采集系统设计与配置实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入探讨Apache Flume的数据采集系统设计,涵盖Flume Agent、Source、Channel、Sink的核心概念及其配置实战。通过实例展示了文件日志收集、网络数据接收、命令行实时数据捕获等场景。此外,还讨论了Flume与同类工具的对比、实际项目挑战及解决方案,以及未来发展趋势。提供配置示例帮助理解Flume在数据集成、日志收集中的应用,为面试准备提供扎实的理论与实践支持。
35 1
|
12天前
|
算法 网络协议 安全
HTTP 原理和面试题
HTTP 原理和面试题
|
1天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
12 6
|
5天前
|
监控 Java 数据库连接
总结Spring Boot面试知识点
Spring Boot是一个基于Spring框架的开源项目,它简化了Spring应用的初始搭建以及开发过程。通过提供“约定优于配置”的方式,Spring Boot可以帮助开发者快速构建出生产级别的Spring应用。
13 0
|
23天前
|
数据可视化 Python
Python模型评估与选择:面试必备知识点
【4月更文挑战第17天】本文深入探讨了Python模型评估与选择在面试中的关键点,包括性能度量、过拟合与欠拟合识别、模型比较与选择、模型融合和偏差-方差权衡。强调了避免混淆评估指标、忽视模型验证和盲目追求高复杂度模型的常见错误,并提供相关代码示例,如交叉验证、网格搜索和超参数调优。通过理解这些概念和技巧,可在面试中展示出色的数据科学能力。
33 12
|
28天前
|
Java Go 调度
Go语言并发编程原理与实践:面试经验与必备知识点解析
【4月更文挑战第12天】本文分享了Go语言并发编程在面试中的重要性,包括必备知识点和面试经验。核心知识点涵盖Goroutines、Channels、Select、Mutex、Sync包、Context和错误处理。面试策略强调结构化回答、代码示例及实战经历。同时,解析了Goroutine与线程的区别、Channel实现生产者消费者模式、避免死锁的方法以及Context包的作用和应用场景。通过理论与实践的结合,助你成功应对Go并发编程面试。
25 3
|
1月前
|
缓存 安全 网络协议
【面试必备】HTTP和HTTPS是什么?有什么差异?
HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)是用于在互联网上传输数据的协议。它们都是应用层协议,建立在TCP/IP协议栈之上,用于客户端(如浏览器)和服务器之间的通信。
24 2