从零开始学习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进行了很好的封装。


如果本文中有什么说得不对的地方,欢迎指正交流,将不胜感激~~~

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