超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。——来自百度百科
说白了,其实就是请求-响应协议。
首先,我们先来看个栗子🌰:
在浏览器的地址栏中输入https://blog.csdn.net/m0_46278918
,回车。
可以看到其请求数据:
这些数据已经被浏览器进行排版过了,其实其主要格式为:
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版本服务器以路径作为依据,返回用户所需的内容。
目前最为流行的版本为 1.1,另外 1.0 和 2.0 同样有占比。
Host: blog.csdn.net
Content-Type: text/plain
Content-Length: 3
请求头并不是只有这三项,而是常用有这三项而已,还有其它的,例如:Accept-Encoding: gzip
、Accept-Charset: utf-8
等,就不一一列举了。
其中:
abc
em...就请求内容
说到这里,把请求数据格式基本说明了下,但是,相信大家都可能有疑问,请求数据格式长得是这样,但在代码上它是如何实现的?
好的,代码如下:
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();
}
}
代码的逻辑也比较简单:
返回结果:
这说明了什么??
说明了浏览器进行 HTTP 内部请求的原理没有那么复杂的,只是将请求数据按照一定的格式排版再发送到服务器。
而服务器也按照一定的格式进行数据返回,这便是 HTTP 的响应部分。
//状态行
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
:状态说明其中,最重要为状态码,有以下几种类型:
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。
关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。
首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来。
接下来就需要梳理知识,提升储备了!(Android移动架构师七大专题学习资源)
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
然后再是通过源码来系统性地学习
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
刷大厂面试题备战,增加大厂通过率
历时半年,整理了这份市面上最全面的安卓面试题解析大全。
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。 2.五角星数表示面试问到的频率,代表重要推荐指数
以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。