什么是HTTP
超文本传输协议(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版本
请求方式:
- GET:获取资源
- POST:增加或修改资源
- PUT:修改资源
- DELETE:删除资源
请求路径:
服务器以路径作为依据,返回用户所需的内容。
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等,就不一一列举了。
其中:
- Host:域名
- Content-Type:内容格式
- Content-Length:内容长度
- Accept:客户端能接受的数据类型。如:text/html、application/json
- Accept-Encoding: 客户端能接受的压缩编码类型。如:gzip
- Accept-Charset: 客户端接受的字符集。如:utf-8、GBK
内容:
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();
}
}
代码的逻辑也比较简单:
- 建立 Socket 连接
- 将请求数据进行写入
- 循环读取响应数据并进行输出
返回结果:
这说明了什么??
说明了浏览器进行 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:状态说明
其中,最重要为状态码,有以下几种类型:
- 1xx:临时性消息。服务器收到请求,需要请求者继续执行操作。
- 100 (继续发送)
- 101(正在切换协议)
- 2xx:请求成功。
- 200(成功)
- 201(创建成功)
- 3xx:重定向。需要进一步操作以完成请求。
- 301(永久迁移)
- 302(暂时迁移)
- 304(内容未改变)
- 4xx:客户端错误。请求包含语法错误或者无法完成请求。
- 400(客户端请求错误)
- 401(认证失败)
- 403(被禁止)
- 404(找不到内容)。
- 5xx:服务器错误。服务器在处理请求的过程中发生错误。
- 500(服务器内部错误)