【 构造 HTTP 请求 】

文章目录

  • 一、通过 form 表单构造 HTTP 请求
    • 1.1 form 发送 GET 请求
    • 1.2 form 发送 POST 请求
  • 二、通过 ajax 构造 HTTP 请求
    • 2.1 ajax 发送 GET 请求
    • 2.2 ajax 发送POST 请求
    • 2.3 关于 ajax
  • 三、通过 Java socket 构造 HTTP 请求(了解)

一、通过 form 表单构造 HTTP 请求

form (表单) 是 HTML 中的一个常用标签. 可以用于给服务器发送 GET 或者 POST 请求.注意不要把 form 拼写成 from!!

1.1 form 发送 GET 请求

form 的重要参数:

  1. action: 构造的 HTTP 请求的 URL 是什么.
  2. method: 构造的 HTTP 请求的 方法 是 GET 还是 POST (form 只支持 GET 和 POST).

input 的重要参数:
3. type: 表示输入框的类型. text 表示文本, password 表示密码, submit 表示提交按钮.
4. name: 表示构造出的 HTTP 请求的 query string 的 key. query string 的 value 就是输入框的用户输入的内容.
5. value: input 标签的值. 对于 type 为 submit 类型来说, value 就对应了按钮上显示的文本

代码示例:

<form action="http://abcdef.com/myPath" method="GET">
     <input type="text" name="userId">
     <input type="text" name="classId">
     <input type="submit" value="提交">
</form>

注意: 此时的name属性是描述当前输入框对应的key值是啥

页面展示效果,并填写数据:

在这里插入图片描述
点击 “提交”, 此时就会构造出 HTTP 请求并发送出去

构造的 HTTP 请求(参数放在了queryString中):

在这里插入图片描述

注意: 由于我们的服务器的地址是随便写的, 因此无法获取到正确的 HTTP 响应,后面自己写的服务器就可以针对前端提交的参数来处理请求并返回响应

体会 form 代码和 HTTP 请求之间的对应关系:

在这里插入图片描述

  1. form 的 action 属性对应 HTTP 请求的 URL
  2. form 的 method 属性对应 HTTP 请求的方法
  3. input 的 name 属性对应 query string 的 key
  4. input 的 内容 对应 query string 的 value

1.2 form 发送 POST 请求

修改上面的代码, 把 form 的 method 修改为 POST

其余效果不变,我们主要来看HTTP请求(参数放在body中):

在这里插入图片描述

主要的区别:

  1. method 从 GET 变成了 POST
  2. 数据从 query string 移动到了 body 中

二、通过 ajax 构造 HTTP 请求

从前端角度, 除了浏览器地址栏能构造 GET 请求, form 表单能构造 GET 和 POST 之外, 还可以在JavaScript通过 ajax的方式来构造 HTTP 请求. 并且功能更强大

ajax 全称 Asynchronous Javascript And XML, 是 2005 年提出的一种 JavaScript 给服务器发送
HTTP 请求的方式.特点是可以不需要 刷新页面/页面跳转 就能进行数据传输

注意: 如果要验证 ajax 的功能, 需要提前准备好一份配套的服务器程序

2.1 ajax 发送 GET 请求

引入jQuery:

1.先在搜索引擎搜索jQuery cdn 查询词 2.找到一个合适的cdn的url 3.打开对应的url,复制cdn本体 4.复制粘贴到jQuery.js的本地文件中 5.src这个jQuery.js 文件

创建 test.html,在< script > 标签中编写以下代码:

<body>
    <!--步骤:1.先在搜索引擎搜索jQuery cdn 查询词 2.找到一个合适的cdn的url 3.打开对应的url,复制cdn本体 4.复制粘贴到jQuery.js的本地文件中 5.src这个jQuery.js 文件-->
    <!--通过抓包会发现,http响应中 是200 ok,是获取到响应了的 但是浏览器还是会产生错误,因为浏览器禁止进行跨域访问-->
    <script src="jquery.js"></script>

    <script>
        $.ajax({
            type:'get',
            url:'http://www.sogou.com/index.html',
            success:function(body){
                //success 对应一个回调函数
                //这个函数会在正确获取到http响应之后来调用    就是所谓的异步
                //回调函数的参数就是 响应中的body
                console.log("获取到响应数据" + body);
            },
            error:function(){
                //error 也是一个回调函数,会在请求失败后调用
                console.log("获取响应失败");
            }
        });
    </script>
</body>

通过抓包来观察响应:

在这里插入图片描述

响应中是 200 ok,并且body中也是相关的html代码,但是上述代码大概率还是会报错.

错误形如:
在这里插入图片描述

这个错误是因为 ajax 默认不能 “跨域”, 当前这个test.html页面处在本地文件 .不能通过ajax 请求访问 搜狗 服务器的内容". 只有在同一个服务器地址中,ajax才能被正确处理…如果想要强行进行跨域, 则需要服务器进行配合, 在服务器的响应中设置 “允许跨域” 才可以.

2.2 ajax 发送POST 请求

对于 POST 请求, 需要设置 body 的内容,设置contentType

<!--以下是在前端中构建post请求:body为json格式。然后在后端通过Jackson来读取body中的数据-->
    <input type="text" id="userId">
    <input type="text" id="classId">
    <input type="button" value="提交" id="submit">

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

    <script>
        let userIdInput = document.querySelector('#userId');
        let classIdInput = document.querySelector('#classId');
        let button = document.querySelector('#submit');

        button.onclick = function(){
            $.ajax({
                type:'post',
                url:'postJson',
                contentType: 'application/json',
                //post这样的请求,ajax允许用data来构造请求的body部分(此时构造的其实是一个js对象,通过JSON.stringfy将这个js对象转换成一个json格式的字符串)
                data:JSON.stringify({          
                    userId:userIdInput.value,
                    classId:classIdInput.value
                }),
                success:function(body){
                    console.log(body);
                }
            })
        }
    </script>
</body>

2.3 关于 ajax

前面通过form表单来构造请求是更加原始的方法,使用form表单一定会涉及到 页面跳转,即浏览器会加载出全新的页面,这显然是不合理的。我们只希望加载其中变化的小部分,这时我们就可以使用ajax了.

通过ajax来构造出http请求,再通过js代码以回调函数的方式来处理这里的响应,并把得到的数据更新到页面上,从而不需要加载出新的页面

ajax 全称 Asynchronous Javascript And XML,即 异步编程 !那啥是异步呢?调用者发起一个请求后就不管了,等待被调用者结果出来之后主动来通知调用者

举个例子:

我去饭店吃饭,点完菜之后就去找个位置坐下啥也不管了,等菜好了就直接给我端上来了

有异步那就肯定有同步,这里简单介绍下同步。同步等待中分为阻塞式的和非阻塞式的.接着上面的例子,同步阻塞即我点完菜就一直等着直到菜做好端走,而同步非阻塞即我点完菜后,一会儿干其他事,一会儿又跑回来看看菜做好了没

三、通过 Java socket 构造 HTTP 请求(了解)

所谓 “发送 HTTP 请求”, 本质上就是按照 HTTP 的格式往 TCP Socket 中写入一个字符串.

所谓 “接受 HTTP 响应”, 本质上就是从 TCP Socket 中读取一个字符串, 再按照 HTTP 格式来解析.

基于 Socket 的知识, 可以构造出一个简单的 HTTP 客户端程序, 用来发送各种类型的 HTTP 请求

public class HttpClient {
    private Socket socket;
    private String ip;
    private int port;
    public HttpClient(String ip, int port) throws IOException {
        this.ip = ip;
        this.port = port;
        socket = new Socket(ip, port);
    }
    public String get(String url) throws IOException {
        StringBuilder request = new StringBuilder();
        // 构造首行
        request.append("GET " + url + " HTTP/1.1\n");
        // 构造 header
        request.append("Host: " + ip + ":" + port + "\n");
        // 构造 空行
        request.append("\n");
        // 发送数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(request.toString().getBytes());
        // 读取响应数据
        InputStream inputStream = socket.getInputStream();
        byte[] buffer = new byte[1024 * 1024];
        int n = inputStream.read(buffer);
        return new String(buffer, 0, n, "utf-8");
    }
    public String post(String url, String body) throws IOException {
        StringBuilder request = new StringBuilder();
        // 构造首行
        request.append("POST " + url + " HTTP/1.1\n");
        // 构造 header
        request.append("Host: " + ip + ":" + port + "\n");
        request.append("Content-Length: " + body.getBytes().length + "\n");
        request.append("Content-Type: text/plain\n");
        // 构造 空行
        request.append("\n");
        // 构造 body
        request.append(body);
        // 发送数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(request.toString().getBytes());
        // 读取响应数据
        InputStream inputStream = socket.getInputStream();
        byte[] buffer = new byte[1024 * 1024];
        int n = inputStream.read(buffer);
        return new String(buffer, 0, n, "utf-8");
    }
    public static void main(String[] args) throws IOException {
        HttpClient httpClient = new HttpClient("42.192.83.143", 8080);
        String getResp = httpClient.get("/AjaxMockServer/info");
        System.out.println(getResp);
        String postResp = httpClient.post("/AjaxMockServer/info", "this is body");
                System.out.println(postResp);
    }
}

使用 Java 构造的 HTTP 客户端不再有 “跨域” 限制了, 此时也可以用来获取其他服务器的数据了

HttpClient httpClient = new HttpClient(“www.sogou.com”, 80);
String resp = httpClient.get(“/index.html”);
System.out.println(resp);
// 此时可以获取到 搜狗主页 的 html

注意: 跨域只是浏览器的行为, 对于 ajax 有效. 对于其他语言来说一般都和跨域无关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Element Plus 实例详解(六)___Progress 进度条

Element Plus 实例详解&#xff08;六&#xff09;___Progress 进度条 本文目录&#xff1a; 一、前言 二、搭建Element Plus试用环境 1、搭建Vue3项目&#xff08;基于Vite Vue&#xff09; 2、安装Element Plus 三、Element Plus Progress 进度条功能试用 1、直线进度条…

【数据结构】栈和队列

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…

血细胞智能检测与计数软件(Python+YOLOv5深度学习模型+清新界面版)

摘要&#xff1a;血细胞智能检测与计数软件应用深度学习技术智能检测血细胞图像中红细胞、镰状细胞等不同形态细胞并可视化计数&#xff0c;以辅助医学细胞检测。本文详细介绍血细胞智能检测与计数软件&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码以及Py…

HTTP协议详解(上)

目录 前言&#xff1a; 认识URL HTTP协议方法 通过Fiddler抓包 GET和POST之间典型区别 header详解 HTTP响应状态码 常见状态码解释 状态码分类 HTTP协议报文格式 小结&#xff1a; 前言&#xff1a; HTTP协议属于应用层协议&#xff0c;称为超文本传输协议&#xff…

C++中的string类【详细分析及模拟实现】

string类 目录string类一、stirng的介绍及使用1.为什么学习string类&#xff1f;2.标准库中的string类2.1 引入&#xff1a;编码2.2 basic_string3.string类的使用3.1 构造函数3.2 遍历string方式1&#xff1a;for循环方式2&#xff1a;范围for4.迭代器4.1 正向迭代器4.2反向迭…

STM-32:按键控制LED灯 程序详解

目录一、基本原理二、接线图三、程序思路3.1库函数3.2程序代码注&#xff1a;一、基本原理 左边是STM322里电路每一个端口均可以配置的电路部分&#xff0c;右边部分是外接设备 电路图。 配置为 上拉输入模式的意思就是&#xff0c;VDD开关闭合&#xff0c;VSS开关断开。 浮空…

互联网数据挖掘与分析讲解

一、定义 数据挖掘&#xff08;英语&#xff1a;Data mining&#xff09;&#xff0c;又译为资料探勘、数据采矿。它是数据库知识发现&#xff08;英语&#xff1a;Knowledge-Discovery in Databases&#xff0c;简称&#xff1a;KDD)中的一个步骤。数据挖掘一般是指从大量的数…

多线程(四):线程安全

在开始讲解线程安全之前我们先来回顾一下我们学了那些东西了&#xff1a; 1. 线程和进程的认识 2. Thread 类的基本用法 3. 简单认识线程状态 4. 初见线程安全 上一章结束时看了一眼线程安全问题&#xff0c;本章将针对这个重点讲解。 一个代码在单线程中能够安全执行&am…

204. 计数质数 (埃式筛法详解)——【Leetcode每日一题】

素数最朴素判断思路&#xff1a;&#xff08;一般会超时&#xff09; 对正整数 n&#xff0c;如果用 2 到 n\sqrt{n}n​ 之间的所有整数去除&#xff0c;均无法整除&#xff0c;则 n 为素数又称为质数。 为什么到n\sqrt{n}n​ 就可以了&#xff0c;因为因数如果存在一定是成对…

【三】一起算法---栈:STL stack、手写栈、单调栈

纸上得来终觉浅&#xff0c;绝知此事要躬行。大家好&#xff01;我是霜淮子&#xff0c;欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码&#xff0c;建立算法思维&#xff1b;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…

使用Node.js+Koa 从零开始写个人博客系统——后端部分(一)

使用Node.jsKoa 从零开始写个人博客系统系列 提示&#xff1a;在此文章中你可以学习到的内容如下&#xff1a; 1 如何使用Koa快速搭建项目 2 对Koa的核心组件Koa-Route的简单使用 3 3层架构思想 4 nodejs的ORM框架——sequelize的使用 5 sequelize-auto的使用 6 简单的增删查改…

【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛客观题以及详细题解

题1 概念题。 USRAT&#xff1a;异步串口通信&#xff0c;常用于数据传输&#xff1b;SW-DP&#xff1a;SWD 的全称应该是 The Serial Wire Debug Port (SW-DP),也就是串行调试端口&#xff0c;是 >ARM 目前支持的两种调试端口之一&#xff1b;JTAG-DP&#xff1a;另一个调试…

git基本用法教程(fork软件+git命令)

git基本用法教程1. git commit2. git branch3. git checkout4. git merge5. git rebase6. 在提交树中移动7. 撤销变更8. 整理提交记录9. 提交的技巧10. git clone11. git push12. git pull13. git fetch14. git flow15. git stash16. fork的使用当然除了环境和demo的运行和改写…

chartgpt 告诉我的,loss 函数的各种知识

一、libtorch中常见的损失函数及其使用场景的总结1. CrossEntropyLoss:CrossEntropyLoss&#xff08;交叉熵损失&#xff09;主要用于分类任务。它适用于多分类问题&#xff0c;其中每个样本只属于一个类别&#xff08;互斥&#xff09;。该损失函数将预测概率与真实标签的one-…

应届生投腾讯,被面试官问了8个和 ThreadLocal 相关的问题。

问&#xff1a;谈一谈ThreadLocal的结构。 ThreadLocal内部维护了一个ThreadLocalMap静态内部类&#xff0c;ThreadLocalMap中又维护了一个Entry静态内部类&#xff0c;和Entry数组。 Entry类继承弱引用类WeakReference&#xff0c;Entry类有一个有参构造函数&#xff0c;参数…

【数据结构】用队列实现栈

&#x1f4af;&#x1f4af;&#x1f4af; 本篇总结利用队列如何实现栈的相关操作&#xff0c;不难观察&#xff0c;栈和队列是可以相互转化的&#xff0c;需要好好总结它们的特性&#xff0c;构造出一个恰当的结构来实现即可&#xff0c;所以本篇难点不在代码思维&#xff0c;…

大数据应用——Hadoop运行模式(伪分布式运行)

4.2 伪分布式运行模式4.2.1 启动HDFS并运行MapReduce程序1. 分析 &#xff08;1&#xff09;配置集群&#xff08;2&#xff09;启动、测试集群增、删、查没有改&#xff08;多台机子麻烦&#xff09;&#xff08;3&#xff09;执行WordCount案例2. 执行步骤&#xff08;1&…

前端vue实现导出pdf文件报告组件

大屏项目有一个需求&#xff0c;需要对展示的内容进行文件导出&#xff0c;但是目前后台没有相关的逻辑&#xff0c;所以只能前端硬上&#xff0c;在参考了其他许多的逻辑之后&#xff0c;目前我自己这边做了一套比较笨的组件&#xff0c;通过拼接标签这种方法来实现对你想需要…

队列-我的基础算法刷题之路(六)

本篇博客旨在整理记录自已对队列的一些总结&#xff0c;以及刷题的解题思路&#xff0c;同时希望可给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉 &#x1f4aa;。…

seaborn从入门到精通03-绘图功能实现02-分类绘图Categorical plots

seaborn从入门到精通03-绘图功能实现02-分类绘图Categorical plots总结参考关系-分布-分类分类绘图-Visualizing categorical data图形级接口catplot--figure-level interface导入库与查看tips和diamonds 数据分类散点图参考分布散点图stripplot分布密度散点图-swarmplot&#…