请求报文

fiddle
请求报文=请求参数
请求报文:
(1)请求行
(2)请求头(request header)
(3)主体(request body)
第一行代表请求行
中间代表请求头
最后一行代表请求体
在这里插入图片描述
请求行:请求方式 请求的资源地址 HTTP的版本
请求头:用来说明服务器所需要的附加信息
请求体:可以添加任何请求信息

request header请求头包含
在这里插入图片描述
(1)cache头域:
cache-Control:用来指定请求的缓存机制
(2)client头域:
accept:代表浏览器可以接收的类型
accept/html:代表可以接收html类型的,如果服务器
没有这种类型那么久返回406
/ 代表可以接收任意类型的数据

Accept-Encoding: 代表浏览器可以接收的编码方式
一般是指压缩方式

Accept-Language:代表浏览器可以支持的语言

user-Agent:代表服务器返回给客户端所支持的操作系统以及浏览器的名字和版本

(3)cookie头域
最重要的header 将cookie值发送给服务器

(4)entity头域
Content-Length: 发送给服务器的长度
Content-Type: 发送给服务器的类型
text/html :html类型
text/plain:文本类型
text/xml:xml类型
image/png:png类型
application/xhtml+xml:XHTML类型
application/json:json类型
application/xml:xml类型
application/x-www-form-urlencoded:以form
表单的形式提交给服务器(key/value)

(5)Miscellaneous头域:
referer:提供给服务器上下文信息,告诉服务器是
从哪个链接过来的

(6)security头域:
origin:最初的请求是从哪里来的
Upgrade-Insecure-Requests: 1
服务器支持https以http访问的时候会自动改为https

(7)transport头域
connection:keep-alive 连接方式是长连接

响应报文(response):
在这里插入图片描述
(1)响应状态(response code)
(2)响应头(response header)
(3)响应体(response body)

response header (响应头包含):
(1)cache 头域
(2)cookie头域
(3)entity头域
last-modified:资源最后修改的时间

(4)miscellanous头域
server:指明服务器的系统和版本
X-Powered-By: PHP/5.3.3
用什么软件开发的

(5)transport头域
(6)location头域
用于重定向一个新的位置,包含新的URL
(7)security头域

以下是转发:
HTTP 头域是HTTP协议中请求(request)和响应(response)中的头部信息,其实就是HTTP通信的操作参数,告诉web服务器和浏览器怎样处理这个通信。HTTP头从一个请求信息或者响应信息的第二行开始(第一行是请求行或者响应行),以两个CR-LF字符组结束(CR:回车符,\r,LF:换行符\n)而每个HTTP头是字符串形式的,用冒号分割的键值对,多个HTTP头之间用CR-LF字符组隔开。

某些http头可以有注释,例如user-agent,server,via。但这些注释会被服务器或者浏览器忽略IETF组织已经将一些核心的HTTP头定义在RFC2616规范中,这些HTTP头是每个基于HTTP协议的软件必须实现的,而其他一些更新和扩展的头域也必须被基于HTTP的软件实现。当然,各个软件也可以定义自己的头域。

另一方面,RFC2616规范中并没有限制每个HTTP头的长度,或者限制HTTP头的数量,但出于性能和安全的考虑,多数服务器都会自己作规定,例如apache2.3 就规定每个HTTP头不能超过8190个字节,每个请求不能超过100个HTTP头。

以下来看看发送一个请求(request)时候,可能包含的各个HTTP头和它的解释。

标准的请求头:

Accept:浏览器(或者其他基于HTTP的客户端程序)可以接收的内容类型(Content-types),例如 Accept: text/plain

Accept-Charset:浏览器能识别的字符集,例如 Accept-Charset: utf-8

Accept-Encoding:浏览器可以处理的编码方式,注意这里的编码方式有别于字符集,这里的编码方式通常指gzip,deflate等。例如 Accept-Encoding: gzip, deflate

Accept-Language:浏览器接收的语言,其实也就是用户在什么语言地区,例如简体中文的就是 Accept-Language: zh-CN

Accept-Datetime:(这个暂时没搞清楚什么意思)

Authorization:在HTTP中,服务器可以对一些资源进行认证保护,如果你要访问这些资源,就要提供用户名和密码,这个用户名和密码就是在Authorization头中附带的,格式是“username:password”字符串的base64编码,例如:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ中,basic指使用basic认证方式, QWxhZGRpbjpvcGVuIHNlc2FtZQ使用base64解码就是“Aladdin:open sesame”

Cache-Control:这个指令在request和response中都有,用来指示缓存系统(服务器上的,或者浏览器上的)应该怎样处理缓存,因为这个头域比较重要,特别是希望使用缓 存改善性能的时候,内容也较多,所以我想在下一篇博文中主要介绍一下。

Connection:告诉服务器这个user agent(通常就是浏览器)想要使用怎样的连接方式。值有keep-alive和close。http1.1默认是keep-alive。keep-alive就是浏览器和服务器 的通信连接会被持续保存,不会马上关闭,而close就会在response后马上关闭。但这里要注意一点,我们说HTTP是无状态的,跟这个是否keep-alive没有关系,不要认为keep-alive是对HTTP无状态的特性的改进。

Cookie:浏览器向服务器发送请求时发送cookie,或者服务器向浏览器附加cookie,就是将cookie附近在这里的。例如:Cookie:user=admin

Content-Length:一个请求的请求体的内存长度,单位为字节(byte)。请求体是指在HTTP头结束后,两个CR-LF字符组之后的内容,常见的有POST提交的表单数据,这个Content-Length并不包含请求行和HTTP头的数据长度。

Content-MD5:使用base64进行了编码的请求体的MD5校验和。例如:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==

Content-Type:请求体中的内容的mime类型。通常只会用在POST和PUT方法的请求中。例如:Content-Type: application/x-www-form-urlencoded

Date:发送请求时的GMT时间。例如:Date: Tue, 15 Nov 1994 08:12:31 GMT

Expect:指示需要使用服务器某些特殊的功能。(这个我不是很清楚)

From:发送这个请求的用户的email地址。例如:From: user@example.com

Host:被服务器的域名或IP地址,如果不是通用端口,还包含该端口号,例如:Host: www.some.com:182

If-Match:通常用在使用PUT方法对服务器资源进行更新的请求中,意思就是,询问服务器,现在正在请求的资源的tag和这个If-Match的tag相不相同,如果相同,则证明服务器上的这个资源还是旧的,现在可以被更新,如果不相同,则证明该资源被更新过,现在就不用再更新了(否则有可能覆盖掉其他人所做的更改)。

If-Modified-Since:询问服务器现在正在请求的资源在某个时间以来有没有被修改过,如果没有,服务器则返回304状态来告诉浏览器使用浏览器自己本地的缓存,如果有修改过,则返回200,并发送新的资源(当然如果资源不存在,则返回404。)

If-None-Match:和If-Modified-Since用意差不多,不过不是根据时间来确定,而是根据一个叫ETag的东西来确定。关于etag我想在下一篇博客介绍一下。

If-Range:告诉服务器如果这个资源没有更改过(根据If-Range后面给出的Etag判断),就发送这个资源中在浏览器缺少了的某些部分给浏览器,如果该资源以及被修改过,则将整个资源重新发送一份给浏览器。

If-Unmodified-Since:询问服务器现在正在请求的资源在某个时刻以来是否没有被修改过。

Max-Forwards:限制请求信息在代理服务器或网关中向前传递的次数。

Pragma:好像只有一个值,就是:no-cache。Pragma:no-cache 与cache-control:no-cache相同,只不过cache-control:no-cache是http1.1专门指定的,而Pragma:no-cache可以在http1.0和1.1中使用

Proxy-Authorization:连接到某个代理时使用的身份认证信息,跟Authorization头差不多。例如:Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Range:在HTTP头中,"Range"字眼都表示“资源的byte形式数据的顺序排列,并且取其某一段数据”的意思。Range头就是表示请求资源的从某个数值到某个数值间的数据,例如:Range: bytes=500-999 就是表示请求资源从500到999byte的数据。数据的分段下载和多线程下载就是利用这个实现的。

Referer:指当前请求的URL是在什么地址引用的。例如在www.a.com/index.html页面中点击一个指向www.b.com的超链接,那么,这个www.b.com的请求中的Referer就是www.a.com/index.html。通常我们见到的图片防盗链就是用这个实现的。

Upgrade:请求服务器更新至另外一个协议,例如:Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

User-Agent:通常就是用户的浏览器相关信息。例如:User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0

Via:用来记录一个请求经过了哪些代理或网关才被送到目标服务器上。例如一个请求从浏览器出发(假设使用http/1.0),发送给名为 SomeProxy的内部代理,然后被转发至www.somenet.com的公共代理(使用http/1.1),最后被转发至目标服务器www.someweb.com,那么在someweb.com中收到的via 头应该是:via:1.0 someProxy 1.1 www.someweb.com(apache 1.1)

Warning:记录一些警告信息。

通用但非标准的HTTP头(通常,非标准的头域都是用“X-”开头,例如"x-powered-by"):

X-Requested-With:主要是用来识别ajax请求,很多javascript框架会发送这个头域(值为XMLHttpRequest)

DNT:DO NOT TRACK的缩写,要求服务器程序不要跟踪记录用户信息。DNT: 1 (开启DNT) DNT: 0 (关闭DNT)火狐,safari,IE9都支持这个头域,并且于2011年3月7日被提交至IETF组织实现标准化

X-Forwarded-For:记录一个请求从客户端出发到目标服务器过程中经历的代理,或者负载平衡设备的IP。

X-Forwarded-Proto:记录一个请求一个请求最初从浏览器发出时候,是使用什么协议。因为有可能当一个请求最初和反向代理通信时,是使用https,但反向代理和服务器通信时改变成http协议,这个时候,X-Forwarded-Proto的值应该是https

Front-End-Https:微软使用与其负载平衡的一个头域。

X-ATT-DeviceId:AT&A的产品中使用的头域,不过不是很清楚用途。

### 27服务请求报文的结构与用途 在计算机网络通信中,不同类型的请求报文用于实现特定的服务功能。虽然未提供具体关于“27服务”的定义,但从常见的网络协议和服务模式来看,“27服务”可能涉及某种专用的应用层协议或自定义服务交互机制。 #### 请求报文的一般组成 通常情况下,应用层服务请求报文可以分为以下几个部分[^1]: - **起始行**: 定义请求的方法、目标资源以及使用的协议版本。 - **头部字段**: 提供元数据信息,例如内容类型、编码方式、认证信息等。 - **主体**: 包含实际的数据负载,可能是JSON格式、XML格式或其他二进制数据流。 如果假设“27服务”是一种基于HTTP的API服务,则其请求报文可能会遵循如下格式: ```plaintext POST /api/service27 HTTP/1.1 Host: example.com Content-Type: application/json Authorization: Bearer YOUR_ACCESS_TOKEN Content-Length: 59 { "action": "query", "parameters": { "id": "27" } } ``` 上述示例展示了如何构建一个针对“27服务”的标准HTTP POST请求。其中`Content-Type`表明消息体采用的是JSON格式,而具体的业务逻辑被封装到JSON对象内部[^2]。 #### 响应处理机制 对于成功的操作,服务器应当按照约定好的形式返回结果。例如,在RESTful API设计原则下,成功查询某条记录后的响应可能类似于下面这样: ```json { "status": "success", "data": { "service_id": "27", "description": "This is service number twenty-seven.", "details": {} } } ``` 然而,当遇到错误情况时,无论是由于客户端发起非法请求还是服务器端出现问题,都需依据既定规则给出恰当反馈。以Modbus为例,存在四种主要情形来描述不同的失败原因[^3]: 1. 若无任何回应,则意味着发生了严重的传输级故障或者目的地址不可达; 2. 收到异常帧表示所提需求虽送达却未能被执行(如访问越界存储区); 3. 耐心等待一段时间后仍未见到预期答复则判定为超时期满事件发生; 4. 正常流程下的拒绝动作也可能通过专门的状态码体现出来以便于调试定位问题所在位置。 至于SNMP这类专注于网络管理领域内的工具而言,它的PDU结构更加复杂一些,除了基本的操作命令之外还包括了许多额外控制选项用来增强灵活性和安全性[^4]。 ### 示例代码片段展示SNMP Get Request构造过程 以下是利用Python pysnmp库创建简单GetRequest PDU实例的过程演示: ```python from pysnmp.hlapi import * errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData('public'), UdpTransportTarget(('demo.snmplabs.com', 161)), ContextData(), ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0))) if errorIndication: print(errorIndication) elif errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex)-1][0] or '?')) else: for varBind in varBinds: print(' = '.join([x.prettyPrint() for x in varBind])) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值