Loading...

HTTP协议讲解

2025-03-31
0
-
- 分钟
|

HTTP协议讲解

概念: Hyper Text ** Transfer Protocol 超文本 传输协议 ,规定了浏览器和服务器之间的数据传输规则

在这里插入图片描述

特点

  • 基于TCP协议,面向连接,安全
  • 基于请求-响应模型的,一次请求对应一次响应
  • 无状态的,对于事物没有记忆能力,每次请求-响应都是独立的
    • 缺点:多次请求间不能共享数据
    • 优点: 响应速度快

请求协议 常见请求字段

在这里插入图片描述

  • Get方式:请求参数在请求行中,没有请求体,请求大小在浏览器中是有限制的。
  • Post方式:请求参数在请求体中,请求大小没有限制。

请求数据获取

  • web服务器(Tomcat)对http协议的请求数据进行了解析,并进行了封装(HttpServeletRequest),在调用controller方法的时候自动传递给了该方法,因此我们不必直接对原始协议进行操作。

在这里插入图片描述

代码示例:

package com.huohuo;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
    @RequestMapping(value = "/request")
    public String request(HttpServletRequest request) {
        // 获取请求方式
        String method = request.getMethod();
        // 获取请求路径
        String requestURL = request.getRequestURL().toString();
        String requestURI = request.getRequestURI(); // 是资源访问路径
        // 获取请求协议
        String protocol = request.getProtocol();
        // 获取请求参数 - name, age
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        // 获取请求头 - Accept
        String accept = request.getHeader("Accept");

        return "OK<br/>" +
                "method:" + method + "<br/>" +
                "requestURL:" + requestURL + "<br/>" +
                "requestURI:" + requestURI + "<br/>" +
                "protocol:" + protocol + "<br/>" +
                "name:" + name + "<br/>" +
                "age:" + age + "<br/>" +
                "accept:" + accept + "<br/>";
    }
}

启动后访问localhost:8080/request?name=huohuo&age=18

在这里插入图片描述

响应协议 以下是常见的响应状态码:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

web服务器对 http ** 协议的响应数据进行了封装(HttpServeletResponse),并在调用Controller方法的时候传递了该方法,这就使得程序员不必对协议直接进行操作,让web开发更加便捷。

使用response或spring对象进行响应

    @RequestMapping("/response")
    // 第一种方式,响应体是字符串,会自动设置响应头 Content-Type: text/plain;charset=UTF-8
    public void Response(HttpServletResponse response) throws IOException {
        // 设置响应状态码
        response.setStatus(HttpServletResponse.SC_OK); // 200
        // 设置响应头
        response.setHeader("name", "huohuo");
        // 设置响应体
        // 会抛出 IOException, 因为 response.getWriter() 获取的流,是和 response 关联的,
        response.getWriter().write("<h1> hello response </h1>");
    }
// 使用spring中提供的方式,封装对象返回
@RequestMapping("/response2")
// 这是第二种方式,返回 ResponseEntity 对象,会自动设置响应头 Content-Type: text/plain;charset=UTF-8,也可以手动设置
public ResponseEntity<String> response2(HttpServletRequest request) {
    return ResponseEntity
            .status(200)
            .header("name2", "huohuo2")
            .body("<h1> hello response2 </h1>");
}

注:响应头和响应状态码如果没有特殊要求的话,通常不手动设定,服务器会根据请求处理的逻辑自动设置状态码和头

致谢:本文参考黑马程序员的视频。 https://www.bilibili.com/video/BV1yGydYEE3H/?vd_source=1b8f9bfb1d0891faf1c70d7678ae56db

文章目录