什么是HTTP协议?以前看完了百度百科一大篇幅下来,似懂非懂,过了两天,根本忘记了它到底是个什么神秘的存在。
我:小A,你知道HTTP协议是什么东西吗,给我科普一下?
小A:知道啊,它就是一个协议而已,没什么好讲的。
我:......
为了深入的了解HTTP协议,我们先写一个熟悉的带有main方法的java类,完成后点击运行
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Test {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8080);
System.out.println("开启服务器!");
while (true) {
Socket socket = server.accept();
System.out.println("收到请求");
new SocketThread(socket).start();
}
}
private static class SocketThread extends Thread {
private Socket socket;
public SocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
BufferedInputStream in = null;
try {
OutputStream out = socket.getOutputStream();
out.write("success".getBytes());
socket.shutdownOutput();
in = new BufferedInputStream(socket.getInputStream());
StringBuffer buff = new StringBuffer();
byte[] b = new byte[1024];
int len = -1;
while ((len = in.read(b)) != -1) {
buff.append(new String(b, 0, len));
}
System.out.println(buff.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
之后我们新建一个test.html,使用ajax模拟get请求,将下面代码复制到文本中:
<html>
<head>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#btn").click(function() {
$.ajax({
url : "http://127.0.0.1:8080/login",
type : "get",
data : {
user : "hxl",
passwd : "abc123"
},success:function(result){
}
});
});
});
</script>
</head>
<body>
<button id="btn" type="button">click</button>
</body>
</html>
保存后,选择用浏览器打开,点击click按钮,我们会看到控制台打印出类似下面的字符串:GET /login?user=hxl&passwd=abc123 HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: null
Connection: keep-alive
我们再将test.html内容中的【type:"get"】中的get改为post,模拟post请求,保存后打开点击按钮,会打印类似下面的字符串:
POST /login HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 22
Origin: null
Connection: keep-alive
user=hxl&passwd=abc123
做这些步骤有什么意义呢?其实打印的东西就是HTTP请求的协议格式,接下来我们对HTTP请求进行解析。当然HTTP协议还包括一个HTTP响应协议格式,这里不再模拟。
HTTP请求包括三个部分(也可以说是四个部分):请求行、请求头、(空行)、请求正文。
请求行:请求行就是第一行,其中包括请求的方式、请求的路径和请求的协议版本,它们之间有空格隔开。
请求头:请求头就是从第二行开始,一直到末尾有一个空行的地方,请求头的每一行都遵循key:values的格式。
请求正文:请求正文就是空行下面的字符串,我们可以注意到,get请求没有请求正文,get请求把请求正文的内容拼接到请求路径的后面去了
接下来是HTTP响应:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive
Content-Length: 23330
Content-Type: text/html
{code:200,msg:"succcess",result:{...}}
HTTP响应也包括三个内容:状态行、消息头、(空行)、消息正文可以看出,这里和HTTP POST请求的格式差不多,第一行是状态行,包括http协议版本、状态码、状态描述
请求头和消息头内容里面的键值对有很多,我们不需要全部去了解它,只需要记住一些常用的就好了。
说了这么多,知道这些有什么用?说实话,似乎并没有什么大的用处,开发中不需要我们直接对HTTP协议进行操作,但是我们需要去了解它,俗话说:无规矩不成方圆。HTTP协议其实就相当于一个规则,它规定浏览器必须发送HTTP请求协议格式,规定web服务器必须能解析HTTP请求格式并进行相应的处理,处理完成后,规定web服务器必须返回HTTP响应格式,规定浏览器必须能解析HTTP响应并能正确的显示内容。
我们可以这么简单的理解:浏览器必须能发送HTTP请求格式和解析HTTP响应格式,服务器必须能解析HTTP请求和发送HTTP响应格式。
浏览器就是在HTTP协议的基础上产生的,而类似一些容器,如tomcat、jboss等也对http进行了很好的封装。
如果本文中有什么说得不对的地方,欢迎指正交流,将不胜感激~~~