关于HTTP状态码以及请求的构造的深入探讨

HTTP状态码与请求构造深入探讨

关于HTTP状态码以及请求的构造的深入探讨

一、HTTP状态码概述

HTTP状态码(HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。这些状态码由RFC 2616规范定义,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774与RFC 4918等规范的扩展。HTTP状态码的官方注册表由互联网号码分配局(Internet Assigned Numbers Authority)维护。

HTTP状态码的第一个数字代表了响应的五种状态之一,这些状态包括:

  1. 1xx(信息性状态码):表示接收的请求正在处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。客户端应当继续发送请求。
  2. 2xx(成功状态码):表示请求正常处理完毕。这类状态码表示请求已成功被服务器接收、理解、并接受。
  3. 3xx(重定向状态码):需要后续操作才能完成这一请求。这类状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。
  4. 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。这类状态码表明请求包含语法错误或无法完成请求。
  5. 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。这类状态码表示服务器在处理请求的过程中发生了错误。

下面详细介绍一些常见的HTTP状态码:

  • 200 OK:请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。
  • 201 Created:请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其URI已经随Location头信息返回。
  • 202 Accepted:服务器已接受请求,但尚未处理。最终该请求可能会也可能不会被执行。在异步操作的场合下,使用此状态码非常方便。
  • 204 No Content:服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。
  • 301 Moved Permanently:请求的资源已永久移动到新的URL,返回此状态码的响应要求请求者使用新的URL访问该资源。
  • 302 Found:请求的资源临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
  • 304 Not Modified:如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。
  • 400 Bad Request:服务器无法理解请求的格式,客户端不应当重复发送这个请求而没有进行修改。
  • 401 Unauthorized:请求要求身份验证。这个状态码表示该请求需要用户认证。
  • 403 Forbidden:服务器理解请求客户端的请求,但是拒绝执行此请求。
  • 404 Not Found:服务器无法根据客户端的请求找到资源(网页)。通过此状态码,网站设计人员可认为404是一种设计方式,即当存在不想被外界知道的网页时,通过404状态码来阻止外界访问。
  • 500 Internal Server Error:服务器内部错误,无法完成请求。
  • 501 Not Implemented:服务器不支持请求的功能,无法完成请求。
  • 503 Service Unavailable:由于超载或停机维护,服务器目前无法使用。通常,这只是暂时状态。
二、HTTP请求的构造

HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP消息结构由请求行(请求行)、请求头部(头)、空行和请求数据四个部分组成。

1. 请求行

请求行包含了HTTP方法(也称为“动作”或“命令”)、请求资源的URL和HTTP版本。HTTP方法指示要对资源执行的操作,常见的HTTP方法包括GET、POST、PUT、DELETE等。

  • GET:请求一个指定资源的表示形式,使用GET的请求应该仅用于获取数据,不能对服务器上的资源做出任何的变更。
  • POST:用于将实体提交到指定的资源的方法,通常会导致服务器上的状态变化或副作用,并且不一定是幂等的。
  • PUT:用于向服务器上传资源,通常用于更新已存在的资源或创建新的资源。PUT请求应该是幂等的。
  • DELETE:删除指定的资源,DELETE请求应该是幂等的。
2. 请求头部

请求头部包含了多个字段,每个字段都包含一个名字,后面跟着一个冒号,然后是一个可选的空格,接着是一个值,最后是一个CR+LF(即\r\n)。常见的请求头部字段包括:

  • Host:指定被请求资源的Internet主机和端口号。
  • User-Agent:发出请求的浏览器或其他客户端的类型。
  • Accept:浏览器可接受的媒体类型,如text/html、application/xhtml+xml等。
  • Accept-Encoding:浏览器能够进行解码的数据编码方式,如gzip、deflate等。
  • Accept-Language:浏览器接受的自然语言。
  • Connection:管理方式(如keep-alive)。
  • Cookie:存储于客户端的扩展数据。
3. 空行

空行是一个CRLF(回车换行)序列,用来分隔请求头部和请求数据(对于POST或PUT请求)。

4. 请求数据

请求数据(也称为请求主体)是可选的,通常用于POST和PUT请求中。它包含了要发送给服务器的数据,数据的格式由Content-Type头部字段指定。常见的Content-Type包括:

  • application/x-www-form-urlencoded:这是默认的编码格式,表单数据被编码为key/value对,类似于查询字符串。
  • multipart/form-data:这种类型用于当表单需要上传文件时。它允许将表单数据编码为一条消息,其中包含多个表示表单字段的“部分”。
  • application/json:表示发送的数据是JSON格式的。
三、HTTP请求的构造方式

HTTP请求的构造方式有多种,包括通过form表单、ajax、Java Socket等。

1. 通过form表单构造HTTP请求

form表单是HTML中的一个常用标签,可以用于给服务器发送GET或者POST请求。通过修改form表单的action属性、method属性和input标签的name、value属性,可以构造出不同的HTTP请求。

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

点击“提交”按钮后,浏览器会构造出如下的HTTP GET请求:

GET http://abcdef.com/myPath?userId=100&classId=200 HTTP/1.1
Host: abcdef.com
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
  • POST请求

将form表单的method属性修改为POST,即可构造出HTTP POST请求。

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

点击“提交”按钮后,浏览器会构造出如下的HTTP POST请求:

POST http://abcdef.com/myPath HTTP/1.1
Host: abcdef.com
Proxy-Connection: keep-alive
Content-Length: 22
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3

userId=100&classId=200
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值