一、 HTTP工作过程
HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议。
1.基于某个特定的传输层协议(TCP)之上
2.描述业务
3.非OS系统
当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应。
二、 特点
-
支持客户/服务器模式。
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
-
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
-
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
-
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
三、 HTTP 协议格式
1. URL格式
URL (Uniform Resource Locator 统一资源定位符),互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
具体格式如下:
①. 资源在哪台主机上——域名 (domain) 或者 ip 来体现一主机 (host)
②. 和主机上的哪个进程去获取资源——端口 (port)
③. 具体定位到是该进程管理的哪个资源——资源路径/路径 (path)
④. URL设计之初,不仅仅为HTTP协议使用。所以需要标识出本次资源对应的协议(protocol / schema)
⑤. 针对本次请求,除了资源本身之外的特殊要求。(查询字符串 query string、文档片段 fragment)
2. 方法(method)
| 方法 | 说明 | 适用版本号 |
|---|---|---|
| GET | 获取资源 | HTTP 1.0、HTTP 1.1 |
| POST | 传输实体主体 | HTTP 1.0、HTTP 1.1 |
| PUT | 传输文件 | HTTP 1.0、HTTP 1.1 |
| HEAD | 获得报文首部 | HTTP 1.0、HTTP 1.1 |
| DELETE | 删除文件 | HTTP 1.0、HTTP 1.1 |
| OPTIONS | 访问支持的方法 | HTTP 1.1 |
| TRACE | 追踪路径 | HTTP 1.1 |
| CONNECT | 要求用隧道协议连接代理 | HTTP 1.1 |
| LINK | 建立和资源之间的联系 | HTTP 1.1 |
| UNLINE | 断开连接关系 | HTTP 1.1 |
3. GET&POST
| 请求方法 | 构建方式 |
|---|---|
| GET | 1.地址栏输入url回车 2. 通过一些标签<img>;、<script>、<link> 3.还有一些标签<a>、<form> 4. ajax 5. 重定向(redirect) |
| POST | 1. <form method="post"> 2. ajax 3. 重定向(redirect)| |
4. 协议头
| key | value |
|---|---|
| Host | 表示服务器主机的地址和端口 |
| Content-Length | 表示 body 的数据长度,长度单位是字节 |
| Content-Type | 表示 body 的数据格式 |
| User-Agent | 表示浏览器或者操作系统的属性 |
| Referer | 表示这个页面是从哪个页面跳转过来的 |
| Cookie | 是浏览器提供的一种让程序员在本地存储数据的能力 |
5. 协议码
| 常见状态码 | 说明 |
|---|---|
| 200 OK | 这是一个最常见的状态码, 表示访问成功。抓包抓到的大部分结果都是 200 |
| 404 Not Found | 没有找到资源。URL 标识的资源不存在, 那么就会出现 404 |
| 403 Forbidden | 表示访问被拒绝。有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问).。如果用户没有登陆直接访问, 就容易见到 403 |
| 405 Method Not Allowed | 我们学习了 HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等。但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法) |
| 500 Internal Server Error | 服务器出现内部错误. 一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码,一般很少见 |
| 504 Gateway Timeout | 当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况 |
| 302 Move temporarily | 临时重定向。在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页 |
| 301 Moved Permanently | 永久重定向。当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址。301 也是通过 Location 字段来表示要重定向到的新地址 |
状态码总结:
| 类别 | 原因短语 | |
|---|---|---|
| 1XX | Informational (信息性状态码) | 接受的请求正在处理 |
| 2XX | Success (成功状态码) | 请求正常处理完毕 |
| 3XX | Redirection (重定向状态码) | 需要进行附加操作以完成请求 |
| 4XX | Client Error (客户端错误状态码) | 服务器无法处理请求 |
| 5XX | Server Error (服务器错误状态码) | 服务器处理请求出错 |
四. HTTP实例
4.1 HTTP客户端(请求baidu.com)
import java.io.*;
import java.net.Socket;
// HTTP 客户端
public class HTTPClient {
public static void main(String[] args) throws IOException {
// 1. HTTP 客户端,要发送 HTTP 请求,先建立 TCP 连接
// 我们当前进程和www.baidu.com主机上绑定 8080 端口的进程使用 TCP 通信(要求 建立 TCP 连接)
Socket socket = new Socket("localhost", 80);
OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
// 只有请求行,请求头为空,没有请求体
String request = "GET / HTTP/1.0\r\n\r\n";
writer.print(request);
// 冲刷缓冲区
writer.flush();
// 读取百度返回的 HTTP 响应
InputStream is = socket.getInputStream();
byte[] buf = new byte[10240]; // 我们知道响应不会超过 1024 字节的
int n = is.read(buf);
String response = new String(buf, 0, n, "UTF-8");
System.out.println(response);
}
}
4.2 HTTP服务端
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
// HTTP 服务端
public class HTTPServer {
public static void main(String[] args) throws IOException {
// 我们使用短连接
ServerSocket serverSocket = new ServerSocket(80);
while (true) {
try {
Socket socket = serverSocket.accept();
// 不管对方发给我们的 请求 是什么,一律使用统一的响应回复对方
OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
String html = "<a href='https://www.baidu.com/'>百度一下</a>"; // 我们的响应体
byte[] bytes = html.getBytes("UTF-8");
int contentLength = bytes.length;
String response = "HTTP/1.0 200 OK\r\n" +
"Content-Type: application/octet-stream; charset=utf-8\r\n" +
"Content-Length: 49\r\n" +
"\r\n" +
html;
writer.print(response);
writer.flush();
socket.close();
} catch (IOException exc) {
exc.printStackTrace();
}
}
}
}
总结
HTTP协议为整个项目的重要基础,以上内容仅为http部分知识点,还需要掌握更深层的内容,路还很远,学习不止.