在HTTP中,定义了多种请求类型,通常我们关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。
下面来细究HTTP的结构细节:
HTTP的结构分为客户端发送的请求和服务器返回来的响应,先来看一下HTTP的请求和响结构:
a:请求规范包含:HTTP请求报文由3部分组成(请求行+请求头+请求体)
- 请求行
(a)请求方式 + url+协议版本
例如:GET /index.jsp HTTP/1.1 - 请求头
- 一个请求体(可选)
客户端给服务端发送的数据内容.是根据提交请求的类型:post有请求体,get没有请求体
有了枯燥的理论基础,下面来带你直观感受这一协议的请求行具体内容:
第一步:先用java建立写一个服务器的类来模拟服务器(我的是类名HttpDetails,名字随意啦!)你可以照我这样敲就行:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpDetails {
public static void main(String[] args) throws IOException {
ServerSocket ss;
Socket socket;
BufferedReader br;
//监听80端口
ss = new ServerSocket(80);
socket = ss.accept();
InputStream inputStream = socket.getInputStream();
//InputStreamReader 是字节流通向字符流的桥梁
//构造方法摘要:InputStreamReader(InputStream in)
br = new BufferedReader(new InputStreamReader(inputStream));
//输出客户端向本服务器发送的数据
System.out.println(br.readLine());
//关闭资源
ss.close();
socket.close();
br.close();
}
}
第二部:在浏览器中输入要访问的内容:
第三步:看结果:
从结果看出:c/s架构是以HTTP为基础的,c向s发送请求时,发送的请求必须符合规范。这个请求行的意思就是:客户端以get方式向服务器请求index.jsp内容,使用的HTTP版本是1.1。
接着,下面来看看消息头具体内容:
第一步:先用java建立写一个服务器的类来模拟服务器(我的是类名HttpDetails,名字随意啦!)你可以照我这样敲就行:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpDetails {
public static void main(String[] args) throws IOException {
//1.验证请求行
ServerSocket ss;
Socket socket;
BufferedReader br;
//监听80端口
ss = new ServerSocket(80);
socket = ss.accept();
InputStream inputStream = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(inputStream));
//输出客户端向本服务器发送的数据-请求行
System.out.println(br.readLine());
输出客消息头的具体内容
String str=null;
//读入的内容不是空的话,输出消息头
while (!((str=br.readLine()).equals(""))){
System.out.println(str);
}
//关闭资源
ss.close();
socket.close();
br.close();
}
}
第二部:在浏览器中输入要访问的内容:http://localhost/hello.jsp
第三步:看结果:
这是get方式请求得到的结果,包扩了请求头+请求行(没有请求体),下面来看一下post的完整请求报文:
第一步:先用java建立写一个服务器的类来模拟服务器(我的是类名HttpDetails,名字随意啦!)你可以照我这样敲就行:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpDetails {
public static void main(String[] args) throws IOException {
//1.验证请求行
ServerSocket ss;
Socket socket;
BufferedReader br;
//监听80端口
ss = new ServerSocket(80);
socket = ss.accept();
InputStream inputStream = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(inputStream));
//输出客户端向本服务器发送的数据-请求行
System.out.println(br.readLine());
输出客消息头的具体内容
String str=null;
//读入的内容不是空的话,输出消息头
while (!((str=br.readLine()).equals(""))){
System.out.println(str);
}
//关闭资源
ss.close();
socket.close();
br.close();
}
}