HTTP-响应协议(响应状态码、HTTP-协议解析)
创始人
2025-01-09 08:07:20
0

HTTP-响应协议

2.3.1 格式介绍

在这里插入图片描述

与HTTP的请求一样,HTTP响应的数据也分为3部分:响应行响应头响应体

在这里插入图片描述

  • 响应行(以上图中红色部分):响应数据的第一行。响应行由协议及版本响应状态码状态码描述组成

    • 协议/版本:HTTP/1.1
    • 响应状态码:200
    • 状态码描述:OK
  • 响应头(以上图中黄色部分):响应数据的第二行开始。格式为key:value形式

    • http是个无状态的协议,所以可以在请求头和响应头中设置一些信息和想要执行的动作,这样,对方在收到信息后,就可以知道你是谁,你想干什么

    常见的HTTP响应头有:

    Content-Type:表示该响应内容的类型,例如text/html,image/jpeg ;  Content-Length:表示该响应内容的长度(字节数);  Content-Encoding:表示该响应压缩算法,例如gzip ;  Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒 ;  Set-Cookie: 告诉浏览器为当前页面所在的域设置cookie ; 
  • 响应体(以上图中绿色部分): 响应数据的最后一部分。存储响应的数据
    • 响应体和响应头之间有一个空行隔开(作用:用于标记响应头结束)
2.3.2 响应状态码
状态码分类说明
1xx响应中 — 临时状态码。表示请求已经接受,告诉客户端应该继续请求或者如果已经完成则忽略
2xx成功 — 表示请求已经被成功接收,处理已完成
3xx重定向 — 重定向到其它地方,让客户端再发起一个请求以完成整个处理
4xx客户端错误 — 处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5xx服务器端错误 — 处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等

参考: 资料/SpringbootWeb/响应状态码.md

关于响应状态码,我们先主要认识三个状态码,其余的等后期用到了再去掌握:

  • 200 ok 客户端请求成功
  • 404 Not Found 请求资源不存在
  • 500 Internal Server Error 服务端发生不可预期的错误

2.4 HTTP-协议解析

将资料中准备好的Demo工程,导入到我们的IDEA中,有一个Server.java类,这里面就是自定义的一个服务器代码,主要使用到的是ServerSocketSocket

说明:以下代码大家不需要自己写,我们主要是通过代码,让大家了解到服务器针对HTTP协议的解析机制

package com.itheima;  import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets;  /*  * 自定义web服务器  */ public class Server {     public static void main(String[] args) throws IOException {         ServerSocket ss = new ServerSocket(8080); // 监听指定端口         System.out.println("server is running...");          while (true){             Socket sock = ss.accept();             System.out.println("connected from " + sock.getRemoteSocketAddress());             Thread t = new Handler(sock);             t.start();         }     } }  class Handler extends Thread {     Socket sock;      public Handler(Socket sock) {         this.sock = sock;     }      public void run() {         try (InputStream input = this.sock.getInputStream();              OutputStream output = this.sock.getOutputStream()) {                 handle(input, output);         } catch (Exception e) {             try {                 this.sock.close();             } catch (IOException ioe) {             }             System.out.println("client disconnected.");         }     }      private void handle(InputStream input, OutputStream output) throws IOException {         BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));         // 读取HTTP请求:         boolean requestOk = false;         String first = reader.readLine();         if (first.startsWith("GET / HTTP/1.")) {             requestOk = true;         }         for (;;) {             String header = reader.readLine();             if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕                 break;             }             System.out.println(header);         }         System.out.println(requestOk ? "Response OK" : "Response Error");          if (!requestOk) {// 发送错误响应:             writer.write("HTTP/1.0 404 Not Found\r\n");             writer.write("Content-Length: 0\r\n");             writer.write("\r\n");             writer.flush();         } else {// 发送成功响应:             //读取html文件,转换为字符串             InputStream is = Server.class.getClassLoader().getResourceAsStream("html/a.html");             BufferedReader br = new BufferedReader(new InputStreamReader(is));             StringBuilder data = new StringBuilder();             String line = null;             while ((line = br.readLine()) != null){                 data.append(line);             }             br.close();             int length = data.toString().getBytes(StandardCharsets.UTF_8).length;              writer.write("HTTP/1.1 200 OK\r\n");             writer.write("Connection: keep-alive\r\n");             writer.write("Content-Type: text/html\r\n");             writer.write("Content-Length: " + length + "\r\n");             writer.write("\r\n"); // 空行标识Header和Body的分隔             writer.write(data.toString());             writer.flush();         }     } }  

启动ServerSocket程序:

在这里插入图片描述

            Title    
序号 品牌名称 企业名称
010 三只松鼠 三只松鼠
009 优衣库 优衣库
008 小米 小米科技有限公司

浏览器输入:http://localhost:8080 就会访问到ServerSocket程序

  • ServerSocket程序,会读取服务器上html/a.html文件,并把文件数据发送给浏览器
  • 浏览器接收到a.html文件中的数据后进行解析,显示以下内容

在这里插入图片描述

现在大家知道了服务器是可以使用java完成编写,是可以接受页面发送的请求和响应数据给前端浏览器的,而在开发中真正用到的Web服务器,我们不会自己写的,都是使用目前比较流行的web服务器。如:Tomcat

在这里插入图片描述

相关内容

热门资讯

开挂了解!逸趣鄱阳翻精辅助(辅... 开挂了解!逸趣鄱阳翻精辅助(辅助)永和备厅原来是真的辅助器(哔哩哔哩)1、在逸趣鄱阳翻精辅助插件功能...
揭露了解!久久互娱科技(辅助)... 您好,久久互娱科技这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩家在...
科普了解!边锋辅助(辅助)天权... 科普了解!边锋辅助(辅助)天权互动真是真的是有辅助器(哔哩哔哩)边锋辅助是不是有人用挂微扑克wpk插...
详细了解!微乐云南小程序辅助器... 详细了解!微乐云南小程序辅助器(辅助)富赢竟然存在有辅助器(哔哩哔哩)1、该软件可以轻松地帮助玩家将...
关于了解!潇湘游有挂脚本(辅助... 关于了解!潇湘游有挂脚本(辅助)爱玩联盟好像存在有辅助下载(哔哩哔哩)1)潇湘游有挂脚本有没有挂:进...
了解了解!微信a3纸牌辅助(辅... 了解了解!微信a3纸牌辅助(辅助)欢樂其实真的是有辅助下载(哔哩哔哩)1、上手简单,内置详细流程视频...
解密了解!新众亿卡看底牌(辅助... 解密了解!新众亿卡看底牌(辅助)毳毳都是真的有辅助app(哔哩哔哩)一、新众亿卡看底牌可以开透视的定...
专业了解!微友辅助器免费版v3... 专业了解!微友辅助器免费版v3.0(辅助)久久娱乐好像存在有辅助挂(哔哩哔哩)亲,关键说明,微友辅助...
揭露了解!拉米大厅游戏源码(辅... 揭露了解!拉米大厅游戏源码(辅助)友乐广西麻将总是有挂辅助挂(哔哩哔哩)1、点击下载安装,拉米大厅游...
揭幕了解!蜀山四川智能辅助软件... 揭幕了解!蜀山四川智能辅助软件(辅助)长乐互娱本来存在有辅助神器(哔哩哔哩)1、游戏颠覆性的策略玩法...