[17]JAVAEE-HTTP协议

目录

一、什么是HTTP协议

什么时候会用到HTTP协议?

HTTP协议的工作流程

二、HTTP的报文格式

抓包

HTTP请求报文格式 

1.首行

2.header

常见键值对:

3.空行

4.正文(body)(有的时候可以没有)

HTTP响应报文格式

1.首行

常见状态码:

GET和POST的区别

三、构造HTTP请求的方法

1.直接通过浏览器地址栏输入url,可以构造出一个GET请求

2.html中一些特殊标签,也会触发get请求,例如

3.form表单可以触发GET和POST请求

4.ajax构造HTTP请求

回调函数:

跨域问题:

5.POSTMAN构造HTTP请求


一、什么是HTTP协议

HTTP是一个属于应用层的,应用非常广泛的协议

应用层的协议,常常是需要进行“自定义协议”的,但这里的自定义,也并非是要求从零开始设计的,一般来说,是基于一些大佬们已经设计好的协议,稍作调整,而HTTP之所以应用广泛,就在于HTTP的可定制性,即程序员可以以HTTP为蓝本,自定义需要的格式


什么时候会用到HTTP协议?

  • 打开网页
  • 手机app加载数据
  • 微信小程序
  • 打开游戏加载游戏界面
  • ......

HTTP协议的工作流程

HTTP的工作形式,是“一问一答”这种形式的

即:一个请求->一个响应

如图所示,在浏览器中输入网址,此时浏览器就会向服务器发起一个HTTP请求,服务器收到请求后,就会返回一个应答,这个应答中携带的就是网址的HTML。


二、HTTP的报文格式

抓包

要想认识HTTP的报文格式,我们需要用到抓包工具

抓包工具在市面上多种多样,这里介绍一种最广泛的:fiddler(具体安装流程可以自己去搜,这里不做赘述)

在具体信息中,上面是请求,下面是响应

现在我们来抓一个html的搜狗主页的请求包

打开主页www.sogou.com

在fiddler里找到这个包(看host和长度),在右侧的上面点击Raw,然后点击view in notepad查看报文

 

如图所示,这就是一个HTML请求


HTTP请求报文格式 

在一个HTTP请求中,包含了四个部分

  • 1.首行

HTTP方法:主要以GET和POST为主

URL:唯一资源定位符,表示一个网络资源的地址

注意:服务端端口号考研省略,查询字符串也叫query string,是一种键值对形式存在的结构,使用&分割键值对,使用=分割键和值。

以bing的主页为例

版本号:表示当前HTTP协议的版本,最流行的是HTTP/1.1

  • 2.header

header也是键值对结构的,每个键值对占一行,键和值之间使用冒号:分割,这里的键值对可以有N行,且在结束之后会用空行来作为结束标记

常见键值对:

Host:

描述了浏览器要访问的服务器是谁,这里写的不仅仅是地址,还可以是端口号,一般来说,URL和Host中的域名是一致的,但当我们访问的服务器不能直接访问,而是需要通过代理访问,就不一致了,URL表示当前访问的服务器,HOST表示最终访问的服务器

Content-Type:

描述了body的数据格式,常用的格式是json/from表单。

Content-Length:

描述了body的长度

User-Agent:

描述了用户使用的客户端的操作系统的版本,这个键值对最大的作用是区分PC端和PE端

Referer:

描述了当前这个页面是从哪里跳转过来的

Cookie:

Cookie是浏览器在本地存储用户自定义数据的一种关键机制,Cookie的值也是键值对,这些键值对,都是开发者自定义的键值对,不同的网站,会根据不同的需求自行定义这里的键值对。

如图所示,浏览器不能直接访问用户的硬盘,为了解决这个问题,引入了cookie机制,允许网页通过浏览器提供的特定api,往浏览器这边存一些键值对,写入特别的文件中。

Cookie从服务器中来,当浏览器访问服务器时,服务器会在HTTP响应中,通过SET-COOKIE字段,设置COOKIE的键值对,返回给浏览器。浏览器收到数据后会在本地存储。这里的cookie就可以视为一个身份码,后续浏览器向服务器在发送HTTP请求时,会携带自身的cookie一并发送,此时服务器识别到身份码后,就可以知道这个客户端的身份并做出对应响应了

  • 3.空行

  • 4.正文(body)(有的时候可以没有)

HTTP响应报文格式

同样的方式,抓到sogou服务器发回的响应包

 

如图所示,这就是一个响应包的格式

可以看到,在响应中,body是一团乱码,这是因为数据本身是文本,一些网站为了节省空间,将其压缩成二进制的数据了。

为了得到原始内容,我们需要进行解压缩  

点击这里的解压缩选项,在打开响应包,就可以得到原始内容了 

在一个HTTP响应中,同样包含四个部分

  • 1.首行

版本号:和请求相同

状态码:数字 这里的数字来表示本次请求成功或失败以及失败的原因

状态码描述:一个或一组单词 描述状态码的含义

常见状态码:

200 OK:请求成功

404 Not Found:要访问的资源不存在

403 Forbidden:访问被拒绝(没有权限)

500 Internal Server Error:服务器内部错误

504 GateWay Timeout :服务器访问超时了

302 Move temporaily :临时重定向 临时将访问旧的地址被自动引导到新的地址上

301 Moved Permanently :永久重定向 永久将访问旧的地址被自动引导到新的地址上

  • 2.header
  • 3.空行
  • 4.正文(body)(有的时候可以没有)

GET和POST的区别

  • 1.没有本质区别,在GET可以使用的场景,替换成POST也可以
  • 2.GET一般没有body,需要携带数据到URL中,POST一般有body
  • 3.GET习惯上用来表示“获取数据”,而POST是“提交数据”
  • 4.GET通常会设计成幂等(输入一定,输出也一定。幂等是是否可缓存的关键),POST无要求
  • 5.GET可以被浏览器收藏,POST不行

三、构造HTTP请求的方法

1.直接通过浏览器地址栏输入url,可以构造出一个GET请求

2.html中一些特殊标签,也会触发get请求,例如

  • link
  • script
  • img
  • a

3.form表单可以触发GET和POST请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="https://www.sogou.com/abc/def" method="get">
        <input type="text" name="aaa">
        <input type="text" name="bbb">
        <input type="submit" name="提交">
    </form>
</body>
</html>

以此为例,打开这段代码

随便输入一些东西后提交

然后打开fiddled抓包,可以看到

首行可以看到,这里发送了一个GET请求。

form表单同样可以构造一个POST请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="https://www.sogou.com/abc/def" method="post">
        <input type="text" name="aaa">
        <input type="text" name="bbb">
        <input type="submit" name="提交">
    </form>
</body>
</html>

还是一样的流程,在抓个包看一看

可以看到,请求是POST,query string放到了body中

4.ajax构造HTTP请求

这是目前最主流的前后端交互方式

同步和异步

  • 同步:去饭馆吃饭,点完餐后在窗口等老板做好后自己端走(请求的发起者,自行获取响应)
  • 异步:去饭馆吃饭,点完餐后找个地方坐下等老板做完端过来(请求的发起者发起响应后不关注结果,由被请求的一方计算出结果后推送给请求的发起者)

ajax就是前后端异步交互的一种方式

一般来说,JS提供了原生了ajax的api,但是并不好用,所以我们使用jquery中提供的ajax api来实现ajax

这里贴一个Jquery的第三方库地址,便于前端引入

https://code.jquery.com/jquery-3.7.1.min.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ajax</title>
    <!-- 引入第三方库 -->
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
</head>
<body>
    <script>
        $.ajax({
            // 当前请求要发给谁
            url:"https://www.sogou.com",
            // 方法
            type:"get",
            // 请求成功以后,使用一个回调函数处理数据
            success:function(body){
                //写处理响应的代码
            }
        });
    </script>
</body>
</html>

这就是ajax的示例代码

回调函数:

不会立即调用,而是创建好之后,在之后合适的时机调用的函数。

跨域问题:

这是浏览器为了限制安全问题引入的保护机制,也是ajax里一个非常典型的问题

如果ajax运行的页面域名为abc.com

而ajax构造的请求的域名是def.com

那么无论服务器是否响应数据,浏览器都不能处理数据,都会报错

5.POSTMAN构造HTTP请求

Postman是一个无需写代码就可以直接构造HTTP请求的工具,安装过程不赘述

打开后的界面如下

开始构造请求

点击加号创建标签页,随后可以开始构造请求

 在这里就可以构造HTTP请求了

Postman还可以生成代码

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

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

相关文章

AcWing 1.2.1 最长上升子序列模型 + 动态规划 + 图解(详细)

&#xff08;1&#xff09;acwing 4557. 最长上升子序列 4557. 最长上升子序列 - AcWing题库 给定一个长度为 N 的整数序列 a1,a2,…,aN。请你计算该序列的最长上升子序列的长度。上升子序列是指数值严格单调递增的子序列 输入格式 第一行包含整数 N第二行包含 N个整数 a1,a…

TEMU电器等产品要求提供CE-LVD,不接受CE-EMC

最近&#xff0c;TEMU平台对CE资质要求越来越严格&#xff0c;针对CE资质又提出了两点新要求。首先&#xff0c;TEMU平台要求提供正式的CE证书&#xff0c;且必须有签发实验室的盖章或者签字。这一要求是为了确保产品符合欧洲市场的安全标准&#xff0c;也是为了保护消费者的利…

Tomcat的动静分离

一、动态负载均衡 3、台虚拟机模拟&#xff1a; 代理服务器&#xff1a;51 tomcat动态页面&#xff1a;53,54 关闭防火墙和安全机制 配置代理服务器&#xff0c;由于做的是七层代理&#xff0c;所以要在http模块配置 配置前端页面 <!DOCTYPE html> <html> <…

解决node项目一个极度困难的捕获异常却无法读取异常信息的问题

这个项目是集成了第三方NeteaseCloudMusicApi项目的接口代码&#xff0c;我没有直接使用它的接口&#xff0c;因为需要再跑一个npm run开个端口&#xff0c;感觉很麻烦。 所以下定决心&#xff0c;使用拆分代码的方式&#xff0c;硬生生将这个api项目的部分api接口代码集成到了…

构造类型详解及热门题型结构体大小的计算

在编写程序时&#xff0c;简单的变量类型已经不能满足程序中各种复杂数据的需求&#xff0c;因此c语言还提供了构造类型的数据&#xff0c;构造数据是有基本数据按照一定的规则组成的。 目录 结构体类型的概念 结构体变量的定义 结构体变量的初始化 结构体变量的引用 结构…

软件工程——期末复习知识点汇总

本帖的资料来源于某国内顶流高校的期末考试资料&#xff0c;仅包含核心的简答题&#xff0c;大家结合个人情况&#xff0c;按需复习~ 总的来说&#xff0c;大层面重点包括如下几个方面&#xff1a; 软件过程需求工程 设计工程软件测试软件项目管理软件过程管理 1.掌握软件生命…

flutter 使用FlutterJsonBeanFactory工具遇到的问题

如下图&#xff0c;使用FlutterJsonBeanFactory工具生成的数据类 但是其中 生成的 import package:null/&#xff0c;导致的错误&#xff1a;Target of URI doesn’t exist: ‘package:null/generated/json/asd.g.dart’ 尝试过的方法&#xff1a; 手动添加包名&#xff0c;…

Map集合 遍历:lambda方式

package day01;import java.util.*;public class Mapday1 {public static void main(String[] args) {/* HashMap 无序 不重复&#xff0c;会覆盖前面 无索引*/System.out.println("--------------------");Map<String, Integer> map new HashMap<>();m…

Kafka - 消息队列的两种模式

文章目录 消息队列的两种模式点对点模式&#xff08;Point-to-Point&#xff0c;P2P&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff0c;Pub/Sub&#xff09; 小结 消息队列的两种模式 消息队列确实可以根据消息传递的模式分为 点对点模式发布/订阅模式 这两…

Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能

CameraX是JetPack库之一&#xff0c;通过CameraX可以向应用增加相机的功能。在下列内容中&#xff0c;将介绍一个结合CameraX实现一个简单的拍照应用。本应用必须采用Android SDK 34。并通过该简单示例&#xff0c;了解传统View层次组件的UI组件如何与Compose组件结合实现移动应…

【代码思路】2023mathorcup 大数据数学建模B题 电商零售商家需求预测及库存优化问题

各位同学们好&#xff0c;我们之前已经发布了第一问的思路视频&#xff0c;然后我们现在会详细的进行代码和结果的一个讲解&#xff0c;然后同时我们之后还会录制其他小问更详细的思路以及代码的手把手教学。 大家我们先看一下代码这一部分&#xff0c;我们采用的软件是Jupyte…

tftp服务的搭建

TFTP服务的搭建 1 先更新一下apt包 sudo apt-get update2 服务器端(虚拟机上)安装 TFTP相关软件 sudo apt-get install xinetd tftp tftpd -y3 创建TFTP共享目录 mkdir tftp_sharetftp_shaer的路径是/home/cwz/tftp_share 3.1 修改共享目录的权限 sudo chmod -R 777 tftp…

python操作MySQL、SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引(重点)

python操作MySQL(重要) SQL的由来&#xff1a; MySQL本身就是一款C/S架构&#xff0c;有服务端、有客户端&#xff0c;自身带了有客户端&#xff1a;mysql.exe python这门语言成为了MySQL的客户端(对于一个服务端来说&#xff0c;客户端可以有很多) 操作步骤&#xff1a; …

是谁在造谣杭州取消直播带货?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 这个世道&#xff0c;谣言的传播成本很低&#xff1a;比如“杭州禁止直播带货”这件事。 就在今天若水跟我说&#xff1a;“杭州禁止直播是谣言了&#xff0c;辟谣了”让我也赶紧隐藏或删除内容&…

【触想智能】工控一体机与5G物联网技术结合是未来发展趋势

工控一体机也叫工业电脑一体机&#xff0c;是工业应用非常重要的一种产品。目前&#xff0c;工控一体机在工业领域的应用已经非常普及&#xff0c;在繁忙的生产车间、数字化机床、自助服务终端设备等场景中&#xff0c;我们都有看到它的身影。 工控一体机应用的普及已经潜移默化…

InstructionGPT

之前是写在[Instruction-tuning&#xff08;指令微调&#xff09;]里的&#xff0c;抽出来单独讲一下。 基本原理 在做下游的任务时&#xff0c;我们发现GPT-3有很强大的能力&#xff0c;但是只要人类说的话不属于GPT-3的范式&#xff0c;他几乎无法理解。例如&#xff0c;我们…

华为---DHCP中继代理简介及示例配置

DHCP中继代理简介 IP动态获取过程中&#xff0c;客户端&#xff08;DHCP Client&#xff09;总是以广播&#xff08;广播帧及广播IP报文&#xff09;方式来发送DHCPDISCOVER和DHCPREQUEST消息的。如果服务器&#xff08;DHCP Server&#xff09;和 客户端不在同一个二层网络(二…

通过el-tree 懒加载树,创建国家地区四级树

全国四级行政地区树数据库sql下载路径&#xff1a;【免费】全国四级地区(省市县)数据表sql资源-CSDN文库https://download.csdn.net/download/weixin_51722520/88469807?spm1001.2014.3001.5503 我在后台获取地区信息添加了限制&#xff0c;只获取parentid为当前的地…

Gloss优化

Gloss优化&#xff0c;Route – Gloss – Parameters .清除不必要的线和过孔&#xff0c;圆滑线&#xff0c;焊盘中间的线&#xff0c;把转角变成圆弧&#xff0c;自动布线总会产生一些布线效果不好、多余过孔等问题。此时可以利用allegro提供的Gloss命令对设计进行优化和调整&…

ES6新增循环对象的四种方法(通俗易懂)

在我们ES6之前&#xff0c;我们一般都是用for…in来循环对象&#xff0c;现在我们ES6为我们新增了几种方法&#xff0c;让我为大家介绍一下吧&#xff01; 1.Object.keys() 静态方法返回一个由给定对象自身的可枚举的字符串键属性名组成的数组 const obj {name:"zs&quo…