首页 > 其他分享 >web入门-HTTP协议

web入门-HTTP协议

时间:2023-10-22 10:35:11浏览次数:38  
标签:web HTTP 入门 writer sock new 请求

web入门-HTTP协议-概述

HTTP

  • 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。在这里插入图片描述
  • 特点:
    1. 基于TCP协议:面向连接,安全
    2. 基于请求-响应模型的:一次请求对应一次响应
    3. HTTP协议是无状态的协议,对于事务处理没有记忆能力。每次请求-响应都是独立的。
      • 缺点:多次请求间不能共享数据
      • 优点:速度快

web入门-HTTP协议-请求协议

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在idea中准备好了一个页面如下所示:
定义了两个form表单,两个表单项是完全一致的,只是提交方式不一样。第一个表单提交方式是get,第二个表单提交方式是post。

在这里插入图片描述
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="get">
  姓名:<input type="text" name="name"><br>
  密码:<input type="password" name="password"><br>
    <input type="submit" value="提交表单GET">
</form>
<br><br><br>

<form action="" method="post">
    姓名:<input type="text" name="name"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="提交表单POST">
</form>

</body>
</html>
  • 在上面idea截图中点击idea悬浮的浏览器按钮就会打开如下页面:
    在这里插入图片描述
  • 在浏览器中打开开发者工具:
    在这里插入图片描述
  • 测试一下get提交方式:
    get请求方式的请求参数是在请求行中携带的。
    在这里插入图片描述
  • 测试下post请求:
    post请求方式的请求参数是在请求体中携带的。
    在这里插入图片描述

web入门-HTTP协议-响应数据

在这里插入图片描述

在这里插入图片描述

常见的响应状态码

状态码 英文描述 解释
200 OK 客户端请求成功,即处理成功,这是我们最想看到的状态码
302 Found 指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
304 Not Modified 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
403 Forbidden 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
404 Not Found 请求资源不存在,一般是URL输入有误,或者网站资源被删除了
405 Method Not Allowed 请求方式有误,比如应该用GET请求方式的资源,用了POST
428 Precondition Required 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
429 Too Many Requests 指示用户在给定时间内发送了太多请求(“限速”),配合 Retry-After(多长时间后可以请求)响应头一起使用
431 Request Header Fields Too Large 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
500 Internal Server Error 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
503 Service Unavailable 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好

状态码大全:https://cloud.tencent.com/developer/chapter/13553
链接: 状态码大全

web入门-HTTP协议 -协议解析

  • 下面是准备的一段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();
        }
    }
}

  • html文件:
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<table border="1" cellspacing="0" width="500">
    <tr>
        <th>序号</th>
        <th>品牌名称</th>
        <th>企业名称</th>

    </tr>
    <tr align="center">
        <td>010</td>
        <td>三只松鼠</td>
        <td>三只松鼠</td>
    </tr>

    <tr align="center">
        <td>009</td>
        <td>优衣库</td>
        <td>优衣库</td>
    </tr>

    <tr align="center">
        <td>008</td>
        <td>小米</td>
        <td>小米科技有限公司</td>
    </tr>


</table>


</body>
</html>
  • 右键把mian程序运行起来。然后打开浏览器访问

在这里插入图片描述

  • 打开浏览器开发者工具并且刷新页面

在这里插入图片描述
HTTP协议的解析一般封装到软件程序中,这个软件就是web服务器软件,web服务器软件有很多,比如常用的tomcat服务器,有了这些web服务器软件使程序员不用直接对http协议进行操作。有了这些软件开发人员对http解析和处理的代码都不用去做了,开发人员只需要关注当前项目的业务逻辑的实现。

标签:web,HTTP,入门,writer,sock,new,请求
From: https://www.cnblogs.com/zkzap/p/17779259.html

相关文章

  • ABBAC900F学习笔记324:WEB页面访问WINCCweb服务器
    这一篇学习笔记我在新浪博客记录过,地址是ABBAC900F学习笔记324:WEB页面访问WINCCweb服务器_来自金沙江的小鱼_新浪博客(sina.com.cn)我在这里也记录一遍。前段时间测试了一下WINCC7.5SP2web发布功能,并且在本机和远程计算机上IE浏览器访问成功。今天结合一下以前的练习,做ABBFRE......
  • wasm-pack 基于rust 的 WebAssembly 开发工具
    目前基于WebAssembly的应用是越来越多了,同时周边工具以及生成也越来越强大了,wasm-pack是rust周边一个很强大的工具,以下是一个简单的试用参考使用安装 curlhttps://rustwasm.github.io/wasm-pack/installer/init.sh-sSf|sh创建简单项目......
  • 快速搭建API随心搭,让你的web开发更加高效
    随着互联网的发展,越来越多的应用和服务需要通过API接口来实现。API(ApplicationProgrammingInterface,应用程序编程接口)可以理解为两个软件之间的桥梁,通过API接口,两个软件可以相互交流并进行数据交换。如今,API已经成为许多公司和应用程序的核心,因此快速搭建并管理API接口已成为开......
  • Uni-App Http请求
    该插件适用于一般的请求场景,只支持post、get、put和delete请求,目前不适用于其他的请求形式,比如上传,下载等。插件定位为小而美,而不是大而全,目标是切合实际,开箱即用。平台差异说明AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√√√√由于某......
  • Unity2023零基础入门学习
    Unity游戏引擎是什么?游戏引擎是一种软件框架,用于开发和创建电子游戏。它提供了一系列工具和功能,帮助开发者设计、构建和管理游戏的各个方面,包括图形渲染、物理模拟、音频处理、动画、碰撞检测、人工智能等。游戏引擎可以简化游戏开发过程,提高效率,并提供跨平台的支持,使开发者能......
  • Python入门系列20-日志logging模块
    一、概念日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以在他们的代码中调用日志记录相关的方法来表明发生了某些事件,通过一个描述性的消息来描述这个事件,该消息能够可选的包含可变数据。而事件有重要性的概念,重要性被称为严重性级别。二、日志的作用通过记录......
  • Javaweb(十二)
    1、Ajax:异步的JavaScript和XML1.1、Ajax的作用:①、与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据使用了AJAX和服务器进行通信,就可以使用HTML+AJAX来替换JSP页面了②、异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页......
  • Python入门指南
    Python入门指南Python中的“文本”代码用计算机程序设计语言写成的,可以被计算机执行的文本称为代码。输入从外界将数据传递给程序称为输入,即通过输入设备(例如:鼠标、键盘、和摄像头等)向计算机输入数据和信息。输出程序将数据传递给外界称为输出,即把计算机处理结果(例如:屏幕显......
  • C#WebApi 对数据进行缓存加快前请求数据的速度
    usingClassLibrary1;usingClassLibrary2;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.Extensions.Caching.Memory;usingMicrosoft.Extensions.Logging;usingWebApplication1.IServices;usingWebApplication1.Utility.SwaggerExt;namespaceWebApplication1.......
  • web基础漏洞-越权漏洞
    1、介绍越权,是指攻击者访问或者操作了超过当前身份权限的资源。2、场景(1)水平越权攻击者登录账号,对其它账号的专属数据进行了请求或操作。(2)垂直越权1攻击者未登录,而直接对账号专属数据进行了请求或操作。(3)垂直越权2攻击者登录,但是对需要更高权限的数据进行了请求或操......