Android:都快面试了,还不赶紧复习下HTTP!

什么是HTTP

超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。——来自百度百科

说白了,其实就是请求-响应协议。

请求部分

首先,我们先来看个栗子🌰:

在浏览器的地址栏中输入https://blog.csdn.net/m0_46278918,回车。

可以看到其请求数据:

这些数据已经被浏览器进行排版过了,其实其主要格式为:

代码语言:javascript
复制
GET /m0_46278918  HTTP/1.1
Host: blog.csdn.net
Content-Type: text/plain
Content-length: 3

abc

好了,开始进行解析:

请求行:

GET /m0_46278918 HTTP1.1

  • GET:请求方式
  • /m0_46278918:请求路径
  • HTTP1.1:HTTP版本
请求方式:
  • GET:获取资源
  • POST:增加或修改资源
  • PUT:修改资源
  • DELETE:删除资源
请求路径:

服务器以路径作为依据,返回用户所需的内容。

HTTP版本:

目前最为流行的版本为 1.1,另外 1.0 和 2.0 同样有占比。

头部信息:

Host: blog.csdn.net

Content-Type: text/plain

Content-Length: 3

请求头并不是只有这三项,而是常用有这三项而已,还有其它的,例如:Accept-Encoding: gzipAccept-Charset: utf-8等,就不一一列举了。

其中:

  • Host:域名
  • Content-Type:内容格式
  • Content-Length:内容长度
  • Accept:客户端能接受的数据类型。如:text/html、application/json
  • Accept-Encoding:客户端能接受的压缩编码类型。如:gzip
  • Accept-Charset:客户端接受的字符集。如:utf-8、GBK

内容:

abc

em...就请求内容

说到这里,把请求数据格式基本说明了下,但是,相信大家都可能有疑问,请求数据格式长得是这样,但在代码上它是如何实现的?

好的,代码如下:

代码语言:javascript
复制
    private static final String host = "blog.csdn.net";
private static final int port = 80;
private static final String content = "GET /m0_46278918 HTTP/1.1\n" +
"Host: blog.csdn.net\n" +
"Content-Type: text/plain\n\n";
private static String responseContent = "";

public static void main(String[] args) {
    try (Socket socket = new Socket(host, port);
         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
         BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
        writer.write(content);
        writer.flush();
        while ((responseContent = reader.readLine()) != null) {
            System.out.println(responseContent);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}</code></pre></div></div><p>代码的逻辑也比较简单:</p><ul class="ul-level-0"><li>建立 Socket 连接</li><li>将请求数据进行写入</li><li>循环读取响应数据并进行输出</li></ul><p>返回结果:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1722915826636668659.png" /></div></div></div></figure><p>这说明了什么??</p><p>说明了浏览器进行 HTTP 内部请求的原理没有那么复杂的,只是将请求数据按照一定的格式排版再发送到服务器。</p><p>而服务器也按照一定的格式进行数据返回,这便是 HTTP 的响应部分。</p><h3 id="aijkg" name="%E5%93%8D%E5%BA%94%E9%83%A8%E5%88%86">响应部分</h3><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">//状态行

HTTP/1.1 301 Moved Permanently
//头部信息
Server: openresty
Date: Tue, 16 Mar 2021 15:38:14 GMT
Content-Type: text/html
Content-Length: 182
Connection: keep-alive
Keep-Alive: timeout=20
Location: https://blog.csdn.net/m0_46278918

//内容
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>openresty</center>
</body>
</html>

其中,头部信息和内容跟请求数据格式一致,就不再多说,重点看看状态行HTTP/1.1 301 Moved Permanently

  • HTTP/1.1:HTTP 版本
  • 301:状态码
  • Moved Permanently:状态说明

其中,最重要为状态码,有以下几种类型:

  • 1xx:临时性消息。服务器收到请求,需要请求者继续执行操作。
  • 100 (继续发送)
  • 101(正在切换协议)
  • 2xx:请求成功。
  • 200(成功)
  • 201(创建成功)
  • 3xx:重定向。需要进一步操作以完成请求。
  • 301(永久迁移)
  • 302(暂时迁移)
  • 304(内容未改变)
  • 4xx:客户端错误。请求包含语法错误或者无法完成请求。
  • 400(客户端请求错误)
  • 401(认证失败)
  • 403(被禁止)
  • 404(找不到内容)。
  • 5xx:服务器错误。服务器在处理请求的过程中发生错误。
  • 500(服务器内部错误)
面试助力宝典

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。

关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。

首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来。

接下来就需要梳理知识,提升储备了!(Android移动架构师七大专题学习资源)

  • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
  • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化
  • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化
  • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
  • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发
  • 微信小程序:小程序介绍+UI开发+API操作+微信对接
  • Hybrid 开发与Flutter:Html5项目实战+Flutter进阶

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

然后再是通过源码来系统性地学习

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

刷大厂面试题备战,增加大厂通过率

历时半年,整理了这份市面上最全面的安卓面试题解析大全。

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容