【JavaSE】【网络协议】HTTP 请求和响应

一、HTTP请求

1.1 请求格式

请求格式:首行+请求头(header)+空行+正文(body)

1.2 首行组成

首行组成:请求方法+URL+版本号。使用“空格”将他们分隔开。

1.2.1 请求方法

方法 说明 支持的HTTP版本
GET 获取资源 1.0 1.1
POST 传输实体主体 1.0 1.1
PUT 传输文件 1.0 1.1
DELETE 删除文件 1.0 1.1
HEAD 获取报文首部 1.0 1.1
OPTIONS 询问支持的方法 1.1
TRACE 追踪路径 1.1
CONNECT 要求用隧道协议连接代理 1.1
LINK 建立和资源之间的联系 1.0
UNLINK 断开连接关系 1.0
  1. GET⽅法:
    GET 是最常⽤的 HTTP ⽅法。常⽤于获取服务器上的某个资源。

GET方法特点:

  • ⾸⾏的第⼀部分为GET
  • URL 的 query string 可以为空, 也可以不为空.
  • header 部分有若⼲个键值对结构。
  • body 部分一般没有,正文包含在URL的查询字符串中。
  1. POST ⽅法:
    POST ⽅法也是⼀种常⻅的⽅法。多⽤于提交⽤⼾输⼊的数据给服务器(例如登陆⻚⾯)。
    通过 HTML 中的 form 标签可以构造 POST 请求, 或者使⽤ JavaScript 的 ajax 也可以构造 POST 请求。

POST 请求的特点:

  • ⾸⾏的第⼀部分为 POST
  • URL 的 query string ⼀般为空 (也可以不为空)
  • header 部分有若⼲个键值对结构
  • body 部分⼀般不为空. body内的数据格式通过 header 中的 Content-Type 指定. body 的⻓度
    由 header 中的 Content-Length 指定.

GET与POST的区别:

  1. 语义不同:GET一般是获取数据,POST一般是提交数据。
  2. 携带数据的方式不同:
    2.1. GET 的 body ⼀般为空, 需要传递的数据通过 query string 传递,
    2.2. POST 的 query string ⼀般为空,需要传递的数据通过 body 传递。
  3. GET 请求通常建议是幂等的(HTTP官方文档建议)(幂等就是如果多次请求得到的结果⼀样,就视为请求是幂等的)。
  4. GET 设计成幂等时,那么GET 请求的结构就可以被缓存, POST 的不能被缓存。
  5. 但其实两者区别都不大,经常被混着用。

1.2.2 URL组成

URL组成:协议名称 : //要访问的服务器的ip地址或者域名 /端口号 /带有层次结构的路径 ?查询字符串

成分解析

  1. 协议名称:使用的协议。
  2. 要访问的服务器的ip地址或者域名:确定主机。(ip和域名的相互转换通过DNS域名解析系统完成)。
  3. 端口号:确定程序。没写就是浏览器自动添加默认端口:HTTP是80,HTTPS是443。
  4. 带有层次结构的路径:确定具体资源。
  5. 查询字符串(query string):本质是⼀个键值对结构。键值对之间使⽤ &分隔。键和值之间使⽤ = 分隔。
  6. 片段标识符:放在query string之后的,主要⽤于⻚⾯内跳转,通过不同的⽚段标识区分页面的内容。现在很少用。
  7. 登陆信息:在协议名与服务器ip之间。现在的⽹站进⾏⾝份认证⼀般不再通过 URL 进⾏了。⼀般都会省略。

URLencode:

像 / ? : 等这样的字符, 已经被 URL 当做特殊意义理解了。因此这些字符不能随意出现。
所以当某个参数中需要带有这些特殊字符, 就必须先对特殊字符进⾏转义.这就是URLencode。
其实对非英语的文字也会进行转义。

转义的规则如下:

将需要转码的字符转为16进制,然后从右到左,取4位(不⾜4位直接处理),每2位做
⼀位,前⾯加上%,编码成%XY格式。

URL中的可省略部分:

  • 协议名: 可以省略, 省略后默认为 http://
  • ip 地址 / 域名: 在 HTML 中可以省略(⽐如 img, link, script, a 标签的 src 或者 href 属性).省略后表⽰服务器的 ip / 域名与当前 HTML 所属的 ip / 域名⼀致.
  • 端⼝号: 可以省略. 省略后如果是 http 协议, 端⼝号⾃动设为 80; 如果是 https 协议, 端⼝号⾃动设为443.
  • 带层次的⽂件路径: 可以省略. 省略后相当于 /. 有些服务器会在发现 / 路径的时候⾃动访问/index.html
  • 查询字符串: 可以省略
  • ⽚段标识: 可以省略
  • 登陆信息:可以省略

1.3 请求头(header)

header简介:

  1. header 的整体的格式是 “键值对” 结构.
  2. 每个键值对占⼀⾏. 键和值之间使⽤ 冒号加空格 分割.
  3. 键和值通过RFC标准文档规定

接下来介绍几个重要的header

1.3.1 Host

host:表⽰服务器主机的地址和端⼝.

1.3.2 Content-Length 和 Content-Type

Content-Length:表⽰ body 中的数据⻓度,字节为单位.
Content-Type:表⽰ body 中的数据格式.

关于Content-Type表示各种数据详细表示在这个文档:文档
注意事项:

  • 有时请求中没有body正文,就不会有这两个header。
  • 如果有body正文,没有这两个header或者只有其中一个,那么这就是一个非法的请求或者响应。

1.3.3 User-Agent (简称 UA)

User-Agent里面表示了用户使用的设备的浏览器和操作系统的情况

表⽰浏览器/操作系统的属性. 形如

1.3.4 Referer

表⽰这个⻚⾯是从哪个⻚⾯跳转过来的,直接输入url/点收藏栏打开的页面是没有Referer
。 形如

1.3.5 Cookie

Cookie 中存储了⼀个字符串, 这个数据可能是客⼾端(⽹⻚)⾃⾏通过 JS 写⼊的, 也可能来⾃于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据). 往往可以通过这个字段实现 “⾝份标识” 的功能.

cookie就是浏览器允许网页在本地硬盘存储数据的一种机制.
不是让网页代码直接访问文件系统,而是做了一层抽象.
而是浏览器的cooki提供了键值对存储机制

Cookie是按照键值对形式存储,每个Cookie之间用分号分开

Cookie是程序员自定义,但是有一个通用场景:登录和用户认证。

在服务器端:

  1. 查询数据库,验证你的用户名密码是否有效
  2. 如果匹配成功
    2.1. 生成sessionld
    2.2. 生成session对象
    2.3. 把用户的关键信息保存到session对象中
    2.4. 把sessionld和session对象作为键值对,保存到内存的hash表中
    2.5. 把sessionld,通过Set-Cookie返回给浏览器
  3. 服务器收到后续请求之后,直接通过cookie中的sessionld
    就可以知道当前这个请求是哪个用户发来的了,
    就不需要要求用户重新登陆.

1.4 正文 body

正⽂中的内容格式和 header 中的 Content-Type 密切相关.
下⾯可以通过抓包来观察这⼏种情况:

  • application/x-www-form-urlencoded: form 表单提交的数据格式. 此时 body 的格式形如:
  • multipart/form-data: form 表单提交的数据格式(在 form 标签中加上 enctyped=“multipart/form-data” . 通常⽤于提交图⽚/⽂件. body 格式形如:
  • application/json: 数据为 json 格式. body 格式形如:
  • application/x-www-form-urlencoded
  • multipart/form-data

二、HTTP 响应

2.1 格式

响应格式:首行+响应头(header)+空行+正文(body)

2.2 状态码 (status code)

状态码表⽰访问⼀个⻚⾯的结果. (是访问成功, 还是失败, 还是其他的⼀些情况…).

常见状态码:

  • 200 OK:表示访问成功
  • 404 Not Found:表示访问的资源没找到,URL输入错了
  • 403 Forbidden:访问被拒绝,没有权限
  • 405 Method Not Allowed:请求方法错了
  • 500 Internal Server Error:服务器错误
  • 504 Gateway Timeout:访问超时。Gateway就表示网关,网络的入口。
  • 302 Move temporary:临时重定向,就是访问这个URL,给你跳转到另一个。

  • 2xx就代表成功

  • 3xx代表重定向
  • 4xx代表客户端访问出错
  • 5xx代表服务器错误

2.3 响应"报头"(header)

响应报头的基本格式和请求报头的格式基本⼀致.
Content-Type 响应中的Content-Type 常⻅取值有以下⼏种:

  • text/html : body 数据格式是 HTML
  • text/css : body 数据格式是 CSS
  • application/javascript : body 数据格式是 JavaScript
  • application/json : body 数据格式是 JSON

2.4 响应 “正⽂” (body)

正⽂的具体格式取决于 Content-Type. 观察下⾯⼏个抓包结果中的响应部分.

  • text/html
  • text/css
  • application/javascript
  • application/json

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6202.html

(0)
LomuLomu
上一篇 2025 年 1 月 14 日
下一篇 2025 年 1 月 14 日

相关推荐

  • Java技术全景——分布式文件系统在科研数据管理中的高效实践(187)

    🌟亲爱的技术爱好者们,诚挚邀请您踏入【云端技术驿站】的知识殿堂!在这个信息爆炸的数字时代,我们致力于打造一个兼具深度与温度的技术交流空间。无论您是来探索前沿技术,还是分享实战心得,这里都将成为您理想的栖息地。期待与您共同编织技术的未来篇章!🌟全平台账号(微信公众号/CSDN/抖音/华为生态/支付宝生活号/微博):云端技术驿站一、立即加入【开发者成长联盟】通道…

    2025 年 5 月 12 日
    38100
  • ChatGPT Plus代充国内开通完整完整步骤

    没有海外信用卡时,国内用户开通 ChatGPT Plus 往往会卡在付款环节。虚拟卡要注册和维护,礼品卡还涉及地区设置,共享账号又不适合长期输入工作资料。 下面这套流程适合已经有 ChatGPT 账号、想把 Plus 开到自己账号上的用户。

    未分类 2026 年 6 月 7 日
    3800
  • Claude Pro自己账号代充开通教程

    国内用户开通 Claude Pro 的充值教程,整理 Claude Pro 充值、代充、国内支付和 Organization ID 提交步骤。

    未分类 2026 年 6 月 5 日
    4300
  • Java之反射

    目录 反射 定义 主要用途 反射相关的类 Class类中【获得类相关方法】 Class类中【获得类中属性相关的方法】 Class类中【获得类中注解相关的方法】 Class类中【获得类中构造器相关的方法】 Class类中【获得类中方法相关的方法】 获得Class对象 代码示例1 代码示例2 反射的优缺点 反射 定义 Java的反射(reflection)机制是在…

    2024 年 12 月 28 日
    56500
  • 使用Docker部署的基于binlog实现Mysql8

    概念 MySQL 基于 Binlog 的主从复制(Master-Slave Replication)是 MySQL 数据库中实现数据复制的一种机制。在这种复制模式下,主库(Master)记录所有对数据库的修改操作(如 INSERT、UPDATE、DELETE 等)到 二进制日志(Binlog) ,从库(Slave)则读取这些日志并执行相同的操作,从而保持与主…

    未分类 2025 年 1 月 12 日
    66200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信