什麼是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進行了很好的封裝。
如果本文中有什麼說得不對的地方,歡迎指正交流,將不勝感激~~~