网络原理(三):HTTP 请求 - header & body

目录

1. 引言

2. header 请求头

2.1 Host

2.2 Content-Length & Content-Type

2.2.1 Content-Length

2.2.2 Content-Type

2.3 User-Agent (UA)

2.4 Referer

2.5 Cookie

2.5.1 什么是 Cookie

2.5.2 sessionid / session 对象


1. 引言

上一篇博客为大家讲解了 HTTP 请求中首行的内容(请求方法, URL, 版本号), 这篇博客, 就来和大家聊一聊 HTTP 请求中 header 和 body 中的相关内容.

2. header 请求头

HTTP 请求中的 header 采用的是键值对结构, 通过键和值的形式来管理相关数据.

并且, header 中的键和值都是 RFC 文档中标准规定的(不是由程序员的自定义的).

一个请求的 header 会分成很多行, 每一行表示一个键值对, 键和值之间使用 冒号+空格 进行分割:

接下来, 就和大家一起聊一聊 header 中常见的键值对.


2.1 Host

  • Host: 表示当前请求访问的服务器主机的IP地址(域名)和端口号

Host 的值在大多数的情况下和 URL 中的要访问的域名和端口号是一样的, 都是用来表示要访问的服务器端的位置.

同样, 没写端口号是因为端口号被默认指定了(默认值是啥取决于协议):

  1. http => 80
  2. https => 443

但是这里有一个问题, 既然 URL 中已经有了要访问的服务器的地址, 为啥还要在 Host 中再存一遍呢???

答: 大多数的情况下, Host 中的值和 URL 中的地址是相同的, 但是也存在特殊情况——在使用代理的情况下.

当使用代理时, 客户端发送的请求会先经过代理处理后, 再发送给服务器, 而 "代理", 很有可能会修改 URL 中写入的值, 而代理是无法修改的 Host 中的值的.

所以, 即使使用了代理, 也可以通过 Host 来获取并得知这个请求最原始的目标是谁. (可以将 Host 理解为 "不忘初心, 牢记使命"~~)

此外, Host 还可以用来进行数据校验工作:

HTTP 协议中, 传输的时候可能会涉及到 "加密"(HTTPS), 而加密的只是 header 和 body 中的内容, URL 部分是不会被加密的.

所以, 当服务器收到请求后, 可以将 header 中加密的内容和 URL 中未加密的内容进行一次校验, 检查数据是否一致.

注意: HTTPS 只能保证数据在传输过程中是安全的, 当数据到了服务器上后, 要想保证数据不被黑客攻击导致拖库, 还要在业务层进行加密.

2.2 Content-Length & Content-Type

  1. Content-Length: 表示请求中 body 的数据长度, 单位是字节
  2. Content-Type: 表示请求中 body 的数据格式

header 中是否有这俩属性, 取决于报文中是否有 body.

在请求和响应中, 都会涉及到这两个属性, 当 http 报文中没有 body 时, header 中便没有这俩属性, 但是当有 body 时, 这俩属性必须同时都有.

换句话说, 如果有 body, 但是没有这俩属性, 或者只有1个, 都会认为这是一个非法/错误的 http 报文.

2.2.1 Content-Length

Content-Length 表示请求中 body 的数据长度, 单位是字节.

为什么当有 body 时需要 Content-Length 来标识一个 http 报文的长度呢??

要知道, HTTP 协议, 在传输层是基于 TCP 协议实现的(版本号 <= 2.0). 在应用层时, 字符串会按照 http 约定的格式来进行构造, 当构造完成后, 向下传输给传输层, 数据写入到 TCP socket 中再发送给服务端.

我们知道,  TCP 是面向字节流的, 并且一个 TCP 连接会有多个请求, 而服务器接收数据的时候, 就需要判断一下, 从哪到哪是一个完整的数据, 这时 Content-Length 就会派上

&lt;think&gt;好的,我现在需要帮助用户解决FiddlerScript编译错误的问题。用户提到的错误是&ldquo;Fiddler.Session&#39; object has no such member&rdquo;,出现在尝试获取查询字符串请求体值的第264行。同时,用户需要满足pay=0qs=2025108时导出username、qsbody到指定文件。 首先,我得理解这个错误的原因。通常在JScript中,如果访问了一个对象不存在的属性或方法,就会抛出这样的错误。用户可能在使用oSession的某些方法或属性时拼写错误,或者使用了错误的对象来调用方法。 回顾用户之前的提问我的回答,我之前提供的示例代码中使用了oSession.oRequest[&quot;Username&quot;]来获取用户名,oSession.GetQueryString(&quot;qs&quot;)获取查询参数,以及oSession.GetRequestBodyAsString()获取请求体。但可能用户在实际应用时,这些方法名或属性名有误,导致编译错误。 例如,Fiddler的Session对象是否有GetQueryString方法?或者是否应该使用其他方法来获取查询参数?我需要检查Fiddler的文档或常见用法。通常,获取查询参数可能需要解析URI中的查询字符串,而不是直接调用某个方法。比如,使用oSession.oRequest.QueryString或者通过URI对象来解析。 另外,获取请求体是否正确?可能应该用oSession.GetRequestBodyAsString(),但要注意是否在正确的阶段获取。例如,在OnBeforeResponse函数中,请求体可能已经被处理,这时候可能需要使用其他方法或确保在正确的时机访问。 接下来,用户的代码可能在第264行使用了类似oSession.GetQueryString(&quot;qs&quot;)的调用,但Fiddler.Session并没有这个方法,所以报错。正确的做法可能是解析查询字符串参数,可以使用oSession.PathAndQuery属性,然后自己解析参数,或者使用Fiddler的Utilities方法,比如Fiddler.Utilities.ParseQueryString。 关于请求体,用户可能错误地使用了oSession.RequestBody,而正确的方法应该是oSession.GetRequestBodyAsString(),但需要注意这个方法是否在OnBeforeResponse阶段可用,因为请求体可能在请求发送后已经被释放,所以可能需要启用缓冲。 此外,用户可能需要检查是否在正确的函数中处理这些参数,比如在OnBeforeRequest还是OnBeforeResponse中。如果是在OnBeforeResponse中处理,RequestBody可能已经不可用,这时需要确保在OnBeforeRequest阶段捕获请求体,并保存到会话的标记中,以便后续使用。 最后,保存路径的权限问题也可能导致文件无法写入,需要确保C:\FiddlerData目录存在且有写入权限。同时,路径中的反斜杠在JScript中需要转义为双反斜杠。 总结可能的错误点: 1. 使用了不存在的方法,如GetQueryString。 2. 请求体获取的时机不正确或方法错误。 3. 查询参数解析方式错误。 4. 文件路径问题或权限问题。 接下来,我需要逐步修正代码,替换错误的方法,确保正确解析参数,并处理请求体的获取时机,同时处理可能的异常情况,比如参数不存在时的处理,避免脚本崩溃。同时,添加必要的注释,帮助用户理解每个步骤的作用。&lt;/think&gt;以下是针对FiddlerScript编译错误参数提取问题的分步解决方案: --- ### **1. 错误根本原因** `&#39;Fiddler.Session&#39; object has no such member`错误通常由以下原因导致: - 错误的对象成员调用(如`oSession.GetQueryString()`方法不存在) - 请求阶段限制(如尝试在响应阶段获取请求体) - 参数获取方式错误(URL参数与请求体参数需不同方法提取) --- ### **2. 修复脚本代码** 在**FiddlerScript**(`CustomRules.js`)中修改如下: ```jscript // 在OnBeforeResponse函数中修改(需同时启用缓冲) public static function OnBeforeResponse(oSession: Session) { if (oSession.uriContains(&quot;pay=0&quot;) &amp;&amp; oSession.uriContains(&quot;qs=2025108&quot;)) { // 修复1:正确获取URL查询参数 var queryParams = Fiddler.Utilities.ParseQueryString(oSession.oRequest.headers.RequestPath); var qsValue = queryParams[&quot;qs&quot;] || &quot;未找到qs参数&quot;; // 修复2:从请求头获取username(假设username在Cookie中) var username = oSession.oRequest[&quot;Cookie&quot;].Contains(&quot;username=&quot;) ? oSession.oRequest[&quot;Cookie&quot;].Split(&#39;;&#39;).First(s =&gt; s.Trim().StartsWith(&quot;username=&quot;)).Split(&#39;=&#39;)[1] : &quot;未知用户&quot;; // 修复3:正确获取请求体(需启用缓冲) if (!oSession.bBufferRequestBody) { oSession.bBufferRequestBody = true; // 强制缓冲请求体 } var body = oSession.GetRequestBodyAsString() || &quot;空请求&quot;; // 修复4:路径转义文件操作 var dataLine = username + &quot;|&quot; + qsValue + &quot;|&quot; + body + &quot;\r\n&quot;; var savePath = &quot;C:\\FiddlerData\\output.txt&quot;; if (!System.IO.Directory.Exists(&quot;C:\\FiddlerData&quot;)) { System.IO.Directory.CreateDirectory(&quot;C:\\FiddlerData&quot;); } System.IO.File.AppendAllText(savePath, dataLine, System.Text.Encoding.UTF8); } } ``` --- ### **3. 关键修正点说明** | 错误类型 | 修复方法 | 原理说明 | |------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------| | 查询参数提取 | 使用`Fiddler.Utilities.ParseQueryString()`解析URL | Fiddler未提供直接获取查询参数的方法,需手动解析[^4] | | 请求头参数获取 | 通过`oSession.oRequest[&quot;HeaderName&quot;]`访问特定请求头 | Cookie/Authorization等参数需从请求头逐层解析 | | 请求体丢失 | 设置`oSession.bBufferRequestBody = true` | 默认不缓冲请求体,需显式启用才能多次读取[^5] | | 路径转义 | 使用双反斜杠`C:\\FiddlerData` | JScript字符串中需转义特殊字符 | --- ### **4. 验证步骤** 1. **启用HTTPS缓冲**(可选): - Tools &rarr; Options &rarr; HTTPS &rarr; 勾选&quot;Capture HTTPS CONNECTs&quot; - 勾选&quot;Decrypt HTTPS traffic&quot;(若需要解析加密内容) 2. **触发目标请求**: ```powershell curl &quot;http://example.com/api?pay=0&amp;qs=2025108&quot; -H &quot;Cookie: username=testuser&quot; ``` 3. **检查输出文件**: - 成功示例:`testuser|2025108|{&quot;items&quot;: [1,2,3]}` --- ### **5. 高级调试技巧** - **日志输出**:添加`FiddlerObject.log(dataLine)`在脚本中实时调试 - **异常处理**: ```jscript try { // 参数操作代码 } catch(e) { FiddlerObject.alert(&quot;错误: &quot; + e.message); } ``` - **条件增强**:使用正则表达式精确匹配参数值 ```jscript var isMatch = /qs=2025108(&amp;|$)/.test(oSession.url); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值