告别枯燥理论,直观体验HTTP协议的细节

本文通过实例解析HTTP协议的结构,从请求行、请求头到请求体,深入理解GET和POST的区别。通过Java实现简单服务器,模拟浏览器发送请求,观察不同请求方式下的HTTP报文详情。
摘要由CSDN通过智能技术生成
在HTTP中,定义了多种请求类型,通常我们关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。

下面来细究HTTP的结构细节:
HTTP的结构分为客户端发送的请求和服务器返回来的响应,先来看一下HTTP的请求和响结构:
a:请求规范包含:HTTP请求报文由3部分组成(请求行+请求头+请求体)

  1. 请求行
    (a)请求方式 + url+协议版本
    例如:GET /index.jsp HTTP/1.1
  2. 请求头
  3. 一个请求体(可选)
    客户端给服务端发送的数据内容.是根据提交请求的类型: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();
        }
}

第二部:写了一个html文本,主要是用post方式提交表单:在这里插入图片描述
第三步:看结果:
在这里插入图片描述
post包括get没有的请求体Context-Length: 31

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值