從零開始學習Java Web(一):在代碼中瞭解HTTP協議

    什麼是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進行了很好的封裝。


如果本文中有什麼說得不對的地方,歡迎指正交流,將不勝感激~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章