• Http协议的相关概念


    目录

    HTTP协议

    HTTP的发展

    Web资源

    HTTP协议的完整流程

    请求

    客户端

    ​编辑

    响应

    服务器

    URI和URL

    资源路径

    动态资源

    URL字符的要求

    HTTP请求中的关键信息 

    请求方法

    演示1:通过

    发送POST 请求

    演示2:

    ajax请求/xhr请求 

    执行顺序

    非常常见的一道面试题

    面试题小结

    演示3: 使用ajax发送post+携带请求体的请求

    HTTP响应中的关键信息  

    重定向

    响应头

    form表单提交

    小结


    HTTP协议

    Web应用中的基本单位是Web资源。Web资源分布在网络中的任意主机上,所以本机的浏览器要获取这些Web资源,就必须通过一种网络协议——HTTP协议。

    HTTP协议是以Web资源为基本单位。
    每次请求-响应只能针对一个Web资源进行。

    HTTP的发展

    HTTP: Hyper(超)Text (文本)Transfer(传输)Protocol(协议)
    HTTP协议设计肇始,是为了传输超文本(HTML的前身),随着互联网的发展,HTTP协议传输的不仅仅是超文本了,目前其实任意类型都可以。

    围绕着超文本这套类型发展出来的前端三剑客(HTML、CSS、JavaScript)还是其主流;除此之外,其他多媒体资源也是非常常见的:图片、音频、视频等。

    HTTP协议是一套应用层协议(一开始专注于业务,但现在HTTP协议本身也成为基础协议之一了),所以HTTP协议必须在一套传输层协议上进行传输。传输层的候选协议:UDP、TCP。
    HTTP在1.0、1.1、2.0是基于TCP协议之上进行工作的。(HTTP协议中本身没有设计任何提供可靠性的机制,依赖传输层及以下网络已经提供可靠服务)
    HTTP 在3.0之后,开始基于UDP协议上进行了。(HTTP协议内部自己做可靠性工作了)

    HTTP协议的客户端,一般称为浏览器,同时又被称为用户代理(User-Agent)等名称,网景浏览器可以说是最早的浏览器了。

    Web资源

    Web资源:某些内容或者是执行一些动作,以服务的形式体现。购买一本书(书就是 web资源)、发个快递(发快递动作是web资源)。

    HTTP协议的完整流程

    重点是理解HTTP格式:请求格式和响应格式

    请求

    客户端

    1. import java.io.IOException;
    2. import java.io.InputStream;
    3. import java.io.OutputStream;
    4. import java.net.Socket;
    5. import java.util.Scanner;
    6. /**
    7. * 只能进行一次请求-响应的 HTTP 客户端
    8. */
    9. public class MyHttpClient {
    10. public static void main(String[] args) throws IOException {
    11. // 主机 127.0.0.1
    12. // 端口 8080
    13. // 资源路径 /hello.html
    14. try (Socket socket = new Socket("127.0.0.1", 8080)) {
    15. // 准备 HTTP 请求内容
    16. // 文本 String
    17. // 格式:请求行
    18. String requestLine = "GET /hello.html HTTP/1.0\r\n";
    19. // 请求头:完全可以没有,但必须一个空行结尾
    20. // 请求头中共有 1对 key-value
    21. String requestHeader1 = "Name: xxx\r\n\r\n";
    22. // 请求头中共有 2对 key-value
    23. String requestHeader2 = "Name: xxx\r\nAge: 1993\r\n\r\n";
    24. // 请求头中共有 0 对 key-value
    25. String requestHeader3 = "\r\n";
    26. // 请求体,GET 是没有请求体
    27. // 最终的请求 —— 要发送给服务器的东西
    28. String request = requestLine + requestHeader3;
    29. // 发送服务器的过程
    30. byte[] requestBytes = request.getBytes("ISO-8859-1"); // 字符集编码
    31. // 发送(数据会经由 TCP、IP、以太网发送给服务器)
    32. OutputStream os = socket.getOutputStream();
    33. os.write(requestBytes);
    34. os.flush();
    35. // 请求既然已经发送,我们要做的就是等待响应
    36. InputStream is = socket.getInputStream();
    37. // 响应的前面字符集应该是 ISO-8859-1,后边是 UTF-8
    38. Scanner scanner = new Scanner(is, "UTF-8");
    39. while (scanner.hasNextLine()) {
    40. String line = scanner.nextLine();
    41. System.out.println(line);
    42. }
    43. }
    44. }
    45. }

    响应

    服务器

    1. import java.io.OutputStream;
    2. import java.net.ServerSocket;
    3. import java.net.Socket;
    4. public class MyHttpServer {
    5. public static void main(String[] args) throws Exception {
    6. // 我们也监听在 8080 端口上
    7. try (ServerSocket serverSocket = new ServerSocket(8080)) {
    8. while (true) {
    9. Socket socket = serverSocket.accept(); // 三次握手完成
    10. // 读取用户的请求 :这里就不管用户的请求了,一律采用相同的方式返回响应
    11. // 发送响应
    12. // Content-Type: 浏览器应该按照什么格式来看到我们响应的资源内容的(资源内容放在响应体中)
    13. // 响应体(资源的内容)
    14. String responseBody = "

      Welcome MyHttpServer

      "
      ;
    15. byte[] responseBodyBytes = responseBody.getBytes("UTF-8");
    16. int contentLength = responseBodyBytes.length;
    17. System.out.println("发送响应");
    18. // 响应头
    19. String response = "HTTP/1.0 200 OK\r\n"
    20. + "Server: xxx\r\n"
    21. + "Content-Type: text/plain; charset=utf-8\r\n" // 响应体的类型
    22. + "Content-Length: " + contentLength + "\r\n" // 响应体的长度
    23. + "\r\n";
    24. byte[] responseBytes = response.getBytes("ISO-8859-1");
    25. OutputStream os = socket.getOutputStream();
    26. // TCP 是面向字节流的一种协议,所以只要按顺序发即可,不要管分几次发送
    27. os.write(responseBytes); // 先发送前面部分(响应行 和 响应头)
    28. os.write(responseBodyBytes); // 再发送响应体
    29. os.flush();
    30. // 发送完成之后,直接关闭 TCP 连接(短连接的处理模式)
    31. socket.close();
    32. }
    33. }
    34. }
    35. }

    URI和URL

    经常将ip(域名)+port 合起来称为主机 ( host)

    资源路径

    动态资源

    URL字符的要求

    HTTP请求中的关键信息 

    1.请求方法
    2.请求的资源路径

    3.请求版本
    4.请求头
    5.可能存在的请求体

    请求方法

    演示1:通过
    发送POST 请求

    实验中涉及了两个web 资源

    /post-form.html(静态资源)我们采用GET请求方法
    /demo(动态)我们采用POST请求方法

    演示2:

    ajax请求/xhr请求 

    重点!

    通过JavaScript 发起HTTP请求——俗称ajax请求/xhr请求

    我们使用比较频繁,尤其是在现代 web开发的前后端分离开发模式下。

    使用方式(以下代码是JavaScript代码)︰

    1. // 1. 实例化一个 XMLHttpRequest 对象,简称 XHR 对象
    2. var xhr = new XMLHttpRequest() // JS 语法下的实例化对象
    3. // 2. 调用 对象 的 open(...) 方法,设置 发起请求的 1)方法 2)资源路径
    4. //xhr.open('get', '/demo') // GET /demo
    5. xhr.open('post', '/demo') // POST /demo
    6. // 3. 设置回调函数,当 /demo 资源的响应返回时,应该干什么
    7. // 通过事件绑定机制
    8. // 事件源:xhr 对象
    9. // 事件:load 事件(当响应返回时)
    10. // 事件处理:回调函数
    11. xhr.onload = function() {
    12. console.log(xhr.status) // 打印响应的状态(成功是 200)
    13. console.log(xhr.responseText) // 打印响应的响应体
    14. // 当然响应的其他信息我们都可以获取到,只是一般不关心
    15. }
    16. // 4. 真正发送请求出去
    17. xhr.send()
    1. html>
    2. <html lang="zh-hans">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>发起 ajax 请求title>
    6. head>
    7. <body>
    8. <script src="/js/ajax-demo.js">script>
    9. body>
    10. html>

    执行顺序

    这些代码中有的是JS代码,有的是Java 代码;有的运行在浏览器进程中,有的运行在Tomcat 进程。但这些不重要的,重要的这些语句会按照一定的顺序执行。

    请问执行顺序是什么∶
    答:

    非常常见的一道面试题

    幂等性

    面试题小结

    演示3: 使用ajax发送post+携带请求体的请求

    GET在query string中无论携带什么数据,总体上还是得遵守key=value的形式。但post则非常灵活。

    使用ajax发送post+携带请求体的请求。

    1. @Controller
    2. public class MyController {
    3. @RequestMapping("/collect")
    4. @ResponseBody
    5. public String collect() {
    6. return "OK";
    7. }
    8. }
    1. var xhr = new XMLHttpRequest()
    2. xhr.open('post', '/collect')
    3. xhr.onload = function() {
    4. console.log(xhr)
    5. console.log(this)
    6. }
    7. // 区别在这里
    8. xhr.setRequestHeader('Content-Type', 'text/xxxxxxx')
    9. xhr.send('我随便写,按照 content-type 的格式去写就行')
    1. html>
    2. <html lang="zh-hans">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>发送有请求体的 ajax 请求title>
    6. head>
    7. <body>
    8. <script src="/js/ajax-send-request-body.js">script>
    9. body>
    10. html>

    form表单逻辑上只是一种提交数据的形式。但实际中使用较多,所以form提交的一些行为,代替了get/post 请求的行为。

    HTTP响应中的关键信息  

    重定向

    重定向分类

     

    同理,通过 ajax发起HTTP 404或者其他错误,你是无法在页面中直接看到错误的,所以打开开发者工具去查看。

    响应头

    form表单提交

    总之,文件上传时(通过form表单上传),必须指定enctype为multipart/form-data这样,请求体中才不仅仅携带要上传文件的文件名,还包含文件内容信息。这样,后端才可以读取到信息,做进—步处理。

    小结

  • 相关阅读:
    JMeter应用-循环控制器、计数器的配合使用
    JMeter使用方法
    【GAN】pix2pix算法的数据集制作
    Hadoop(六)
    分布式进化算法
    漏扫环境:数据库篇
    3D 生成重建007-Fantasia3D和Magic3d两阶段玩转文生3D
    echarts 柱状图及折线图常用设置
    FPGA学习—数码管显示
    msvc++中的预编译头文件pch.hpp和stdafx.h
  • 原文地址:https://blog.csdn.net/XHT117/article/details/126285836