HTTP中的GET, POST是常用的两个请求方法。当使用GET请求方法时,可以从浏览器url中看到请求的信息。如:云班课 - 用户登录https://www.mosoteach.cn/web/index.php?c=res&m=index在访问资源后,“?”号后带参数的形式,提交给服务器端数据。 而使用POST方法则看不到。服务器接收到的信息有什么区别呢?通过运行下面的代码查看下区别。
public class WebServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(8080);
Socket socket = server.accept();
InputStream in=socket.getInputStream();
byte[] buf=new byte[1024];
int i = in.read(buf);
if (i!=-1) {
System.out.println(new String(buf) );
}
OutputStream out=socket.getOutputStream();
Date now = new Date();
//修改响应页面,查看get和post的区别
//String s="<HTML><head></head><body>\r\n<h1 align=center>hello</h1>\r\n</BODY></HTML>\r\n";
String s="<HTML><head></head><body>\r\n"+
"<form action=\"http://127.0.0.1:8080/index.html\" method=\"GET\">"
+ "username:<input type=\"text\" name=username><br>"
+"password:<input type=\"text\" name=password><br>"
+ "<input type=\"submit\" value=\"submit\">"
+ "</form>";
String str="HTTP/1.1 200 ok\r\n"
+"Date: " + now + "\r\n"
+"Content-length: " + s.length() + "\r\n"
+"Content-type: text/html;charset=utf-8\r\n\r\n"
+s;
out.write(str.getBytes());
in.close();
out.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个服务器程序运行后,从浏览器访问http://localhost:8080。可以看到响应给浏览器一个表单页面。
再启动服务器程序,提交信息后,在控制台中可以看到请求头的变化如下:
GET /index.html?username=zhangsan&password=123 HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
Accept-Language: zh-CN
...
以上信息在浏览器中调试窗口中也可以看到。
如果把代码<form action="http://127.0.0.1:8080/index.html" method="GET">中提交方法改为POST,提交信息后,请求头的变化如下:
可以看出, post 方法提交信息的时候,可以看到请求体在请求头下并且隔着一个空行。这个在有的浏览器调试窗口中也可以看到。
从请求头中,也可看出Referer这个头的作用。
通过这个程序,可以直观的看到,两个请求方法在服务器端接收的信息的不同,