百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

HTTP基础第二篇(红星照耀中国第二篇概括贺龙的相关事件)

nanshan 2024-10-21 06:03 24 浏览 0 评论

接上一篇。

HTTP请求方法

  • HTTP协议定义了一组请求方法。客户端可以使用这些请求方法之一向HTTP服务器发送请求消息。方法是:
  • GET:客户端可以使用GET请求从服务器获取Web资源。
  • HEAD:客户端可以使用HEAD请求获取GET请求将获得的头。由于标头包含数据的最后修改日期,因此可用于检查本地缓存副本。
  • POST:用于将数据发布到Web服务器。
  • PUT:要求服务器存储数据。
  • DELETE:要求服务器删除数据。
  • TRACE:要求服务器返回所需操作的诊断跟踪。
  • OPTIONS:要求服务器返回它支持的请求方法列表。
  • CONNECT:用于告诉代理与另一个主机建立连接,只需回复内容,而不尝试解析或缓存它。
  • 这通常用于通过代理进行SSL连接。
  • 其他扩展方法。

“GET”请求方法

GET是最常见的HTTP请求方法。

客户端可以使用GET请求方法从HTTP服务器请求(或“get”)一条资源。

GET请求消息采用以下语法:

GET request-URI HTTP-version
(optional request headers)
(blank line)
(optional request body)
  • 关键字GET区分大小写,必须为大写。
  • request-URI:指定所请求资源的路径,该路径必须从文档基目录的根“/”开始。
  • HTTP版本:HTTP / 1.0或HTTP / 1.1。该客户端协商用于当前会话的协议。例如,客户端可以请求使用HTTP / 1.1。如果服务器不支持HTTP / 1.1,它可能会通知响应中的客户端使用HTTP / 1.0。
  • 客户端使用可选的请求标头(例如Accept,Accept-Language等)与服务器协商并要求服务器提供首选内容(例如,以客户首选的语言)。
  • GET请求消息具有可选的请求主体,其包含查询字符串(稍后将对此进行说明)。

测试HTTP请求

有很多方法可以测试HTTP请求。您可以使用实用程序,如“telnet”或“hyperterm”(在c:\ windows下搜索“telnet.exe”或“hypertrm.exe”),或编写自己的网络程序将原始请求消息发送到HTTP服务器测试各种HTTP请求。

Telnet

“Telnet”是一个非常有用的网络实用程序。您可以使用telnet与服务器建立TCP连接;并发出原始HTTP请求。例如,假设您已在端口8000的localhost(IP地址127.0.0.1)中启动了HTTP服务器:

> telnet
telnet> help
... telnet help menu ...
telnet> open 127.0.0.1 8000
Connecting To 127.0.0.1...
GET /index.html HTTP/1.0
(Hit enter twice to send the terminating blank line ...)
... HTTP response message ...

Telnet是一种基于字符的协议。您在telnet客户端上输入的每个字符都将立即发送到服务器。因此,输入raw命令时不能输入拼写错误,因为delete和backspace将被发送到服务器。您可能必须启用“本地回显”选项才能看到您输入的字符。有关使用telnet的详细信息,请查看telnet手册(搜索Windows帮助)。

Network Program

您还可以编写自己的网络程序,以向HTTP服务器发出原始HTTP请求。您的网络程序应首先与服务器建立TCP / IP连接。建立TCP连接后,您可以发出原始请求。

用Java编写的网络程序示例如图所示(假设HTTP服务器在端口8000的localhost(IP地址127.0.0.1)上运行):

import java.net.*;
import java.io.*;
 
public class HttpClient {
 public static void main(String[] args) throws IOException {
 // The host and port to be connected.
 String host = "127.0.0.1";
 int port = 8000;
 // Create a TCP socket and connect to the host:port.
 Socket socket = new Socket(host, port);
 // Create the input and output streams for the network socket.
 BufferedReader in
 = new BufferedReader(
 new InputStreamReader(socket.getInputStream()));
 PrintWriter out
 = new PrintWriter(socket.getOutputStream(), true);
 // Send request to the HTTP server.
 out.println("GET /index.html HTTP/1.0");
 out.println(); // blank line separating header & body
 out.flush();
 // Read the response and display on console.
 String line;
 // readLine() returns null if server close the network socket.
 while((line = in.readLine()) != null) {
 System.out.println(line);
 }
 // Close the I/O streams.
 in.close();
 out.close();
 }
}

HTTP / 1.0 GET请求

以下显示了HTTP / 1.0 GET请求的响应(通过telnet或您自己的网络程序发出的问题 - 假设您已启动HTTP服务器):

GET /index.html HTTP/1.0
(enter twice to create a blank line)
HTTP/1.1 200 OK
Date: Sun, 18 Oct 2009 08:56:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Sat, 20 Nov 2004 07:16:26 GMT
ETag: "10000000565a5-2c-3e94b66c2e680"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
 
<html><body><h1>It works!</h1></body></html>
 
Connection to host lost.

在此示例中,客户端发出GET请求以请求名为“/index.html”的文档;并协商使用HTTP / 1.0协议。请求标头后需要一个空行。此请求消息不包含正文。

服务器接收请求消息,将request-URI解释并映射到其文档目录下的文档。如果请求的文档可用,则服务器返回带有响应状态代码“200 OK”的文档。响应标头提供所返回文档的必要描述,例如上次修改日期(Last-Modified),MIME类型(Content-Type)和文档长度(Content-Length)。响应正文包含所请求的文档。浏览器将根据其媒体类型(例如,纯文本,HTML,JPEG,GIF等)以及从响应头获得的其他信息来格式化和显示文档。

Notes:

  • 请求方法名称“GET”区分大小写,并且必须为大写。
  • 如果请求方法名称拼写错误,服务器将返回错误消息“501 Method Not Implemented”。
  • 如果不允许请求方法名称,服务器将返回错误消息“405 Method Not Allowed”。例如,DELETE是有效的方法名称,但服务器可能不允许(或实现)。
  • 如果request-URI不存在,服务器将返回错误消息“404 Not Found”。您必须从文档根“/”开始发出正确的请求URI。否则,服务器将返回错误消息“400 Bad Request”。
  • 如果HTTP版本丢失或不正确,服务器将返回错误消息“400 Bad Request”。
  • 在HTTP / 1.0中,默认情况下,服务器在传递响应后关闭TCP连接。如果使用telnet连接到服务器,则会在收到响应正文后立即显示“连接到主机丢失”消息。您可以使用可选的请求标头“Connection:Keep-Alive”来请求持久(或保持活动)连接,以便可以通过相同的TCP连接发送另一个请求,以实现更好的网络效率。另一方面,HTTP / 1.1默认使用keep-alive连接。

响应状态代码

响应消息的第一行(即状态行)包含响应状态代码,该响应状态代码由服务器生成以指示请求的结果。

状态代码是一个3位数字:

  • 1xx(信息):收到请求,服务器正在继续该过程。
  • 2xx(成功):请求已成功接收,理解,接受和服务。
  • 3xx(重定向):必须采取进一步措施才能完成请求。
  • 4xx(客户端错误):请求包含错误的语法或无法理解。
  • 5xx(服务器错误):服务器无法满足明显有效的请求。

一些常见的状态代码是:

  • 100继续:服务器收到请求并正在给出响应。
  • 200 OK:请求成功。
  • 301永久移动:请求的资源已永久移动到新位置。新位置的URL在名为Location的响应头中给出。客户端应向新位置发出新请求。应用程序应更新对此新位置的所有引用。
  • 302 Found&Redirect(或暂时移动):与301相同,但新位置暂时属于性质。客户端应发出新请求,但应用程序无需更新引用。
  • 304 Not Modified:响应If-Modified-Since条件GET请求,服务器通知所请求的资源尚未被修改
  • 400错误请求:服务器无法解释或理解请求,可能是请求消息中的语法错误。
  • 401需要身份验证:请求的资源受到保护,并且需要客户端的凭据(用户名/密码)。客户端应使用其凭据(用户名/密码)重新提交请求。
  • 403 Forbidden:无论客户端的身份如何,服务器都拒绝提供资源。
  • 404 Not Found:在服务器中找不到请求的资源。
  • 405不允许的方法:使用的请求方法,例如POST,PUT,DELETE,是一种有效的方法。但是,服务器不允许该方法用于请求的资源。
  • 408请求超时:
  • 414请求URI太大:
  • 500内部服务器错误:服务器混淆,通常是由响应请求的服务器端程序中的错误引起的。
  • 502 Bad Gateway:代理或网关表示它从上游服务器收到错误响应。
  • 503服务不可用:服务器因超载或维护而无法响应。客户可以稍后再试。
  • 504网关超时:代理或网关表示它从上游服务器收到超时。

HTTP / 1.0 GET请求示例

示例:拼错请求方法

在请求中,“GET”拼错为“get”。服务器返回错误“501 Method Not Implemented”。响应标头“允许”告诉客户端允许的方法。

get /test.html HTTP/1.0
(enter twice to create a blank line)
HTTP/1.1 501 Method Not Implemented
Date: Sun, 18 Oct 2009 10:32:05 GMT
Server: Apache/2.2.14 (Win32)
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 215
Connection: close
Content-Type: text/html; charset=iso-8859-1
 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>501 Method Not Implemented</title>
</head><body>
<h1>Method Not Implemented</h1>
<p>get to /index.html not supported.<br />
</p>
</body></html>

示例:找不到文件404

在此GET请求中,无法在服务器的文档目录下找到request-URL“/t.html”。服务器返回错误“404 Not Found”。

GET /t.html HTTP/1.0
(enter twice to create a blank line)
HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2009 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 204
Connection: close
Content-Type: text/html; charset=iso-8859-1
 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /t.html was not found on this server.</p>
</body></html>

示例:错误的HTTP版本号

在此GET请求中,HTTP版本拼写错误,导致语法错误。服务器返回错误“400 Bad Request”。HTTP版本应该是HTTP / 1.0或HTTP / 1.1。

GET /index.html HTTTTTP/1.0
(enter twice to create a blank line)
HTTP/1.1 400 Bad Request
Date: Sun, 08 Feb 2004 01:29:40 GMT
Server: Apache/1.3.29 (Win32)
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD><BODY>
<H1>Bad Request</H1>
Your browser sent a request that this server could not understand.<P>
The request line contained invalid characters following the protocol string.<P><P>
</BODY></HTML>

示例:错误的Request-URI

在以下GET请求中,request-URI不是从根“/”开始,导致“错误请求”。

GET test.html HTTP/1.0
(blank line)
HTTP/1.1 400 Bad Request
Date: Sun, 18 Oct 2009 10:42:27 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1
 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>

示例:Keep-Alive Connection

由于错误,对于HTTP / 1.0 GET请求,服务器在传递响应后关闭TCP连接。您可以通过可选的请求标头“Connection:Keep-Alive”请求维护TCP连接(以便使用相同的TCP连接发送另一个请求,以提高网络效率)。服务器包括一个“Connection:Keep-Alive”响应头,通知客户端他可以在保持活动超时之前使用此连接发送另一个请求。另一个响应标头“Keep-Alive:timeout = x,max = x”告诉客户端超时(以秒为单位)以及可通过此持久连接发送的最大请求数。

GET /test.html HTTP/1.0
Connection: Keep-Alive
(blank line)
HTTP/1.1 200 OK
Date: Sun, 18 Oct 2009 10:47:06 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Sat, 20 Nov 2004 07:16:26 GMT
ETag: "10000000565a5-2c-3e94b66c2e680"
Accept-Ranges: bytes
Content-Length: 44
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
 
<html><body><h1>It works!</h1></body></html>

Notes:

  • keep-alive”超时后出现消息“连接到主机丢失”(对于telnet)。
  • 在出现“连接主机丢失”消息(即保持活动超时)之前,您可以通过相同的TCP连接发送另一个请求。
  • “Connection:Keep-alive”不区分大小写。空间是可选的。如果可选标头拼写错误或无效,则服务器将忽略它。
  • 如果可选标头拼写错误或无效,则服务器将忽略它。

示例:访问受保护的资源

以下GET请求尝试访问受保护的资源。服务器返回错误“403 Forbidden”。

GET /forbidden/index.html HTTP/1.0
(blank line)
HTTP/1.1 403 Forbidden
Date: Sun, 18 Oct 2009 11:58:41 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 222
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /forbidden/index.html
on this server.</p>
</body></html>

第二篇完 喜欢同学可以关注我。

本文版权归是三僡然所有,转载请标明出处。欢迎转载,欢迎评论,欢迎分享。如果你有文章想分享可以联系我。

相关推荐

删库之后不要着急跑路,教你神不知鬼不觉找回数据

在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回。在mysql数据库中,我们知道binlog日志记录了我们对数据库的所有操作,所以...

数据库告警不可用,增删改受阻(数据库限制删除)

前言:昨晚,突然出现服务不可用告警,查看日志上线报文入库到数据库很慢并受阻,出现数据不同步问题。排查问题查看发现服务都是在执行update、insert这些DML命令的时候,报的数据库执行超时。经过一...

Binlog实现MySQL复制,5个关键步骤,务必掌握!

复制是MySQL最重要的功能之一,MySQL集群的高可用、负载均衡和读写分离都是基于复制来实现的。Binlog就是实现主从复制的关键,主数据库将修改操作记录到Binlog中,从数据库通过解...

MySQL数据实时增量同步到Elasticsearch

Mysql到Elasticsearch的数据同步,一般用ETL来实现,但性能并不理想,目前大部分的ETL是定时查询Mysql数据库有没有新增数据或者修改数据,如果数据量小影响不大,但如果几百万上千万的...

MySQL 数据库恢复:如何执行时间点恢复(PITR)以挽救受损数据?

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份、数据取证、数据迁移、网络安全、数据清除等解决方案,并针对企业面临的数据安全风险,提供专业的相关数据安全...

阿里面试:MySQL Binlog有哪些格式?底层原理?优缺点?

binlog的格式也有三种:STATEMENT、ROW、MIXED,下面我详解binlog三种模式@mikechenStatement模式Statement模式:是基于SQL语句的复制(statem...

快速带你读懂MySQL的binlog写入机制

深入讲解MySQL中的重要日志binlog的写入机制以及影响IO性能的关键配置,并且介绍了如何利用binlog去恢复数据,保证MySQL的可靠性。Q:binlog写入时机binlog的写入逻辑并...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...

一文了解MySQL Binlog(一文了解肝脏有益和有害的食物)

MySQL的Binlog日志是一种二进制格式的日志,Binlog记录所有的DDL和DML语句(除了数据查询语句SELECT、SHOW等),以Event的形式记录,同时记录语句执行时...

数据丢失?别慌!MySQL备份恢复攻略

想象一下,某个晴朗的午后,你正享受着咖啡,突然接到紧急电话:你的网站或APP彻底挂了!系统崩溃,界面全白。虽然心头一紧,但你或许还能安慰自己:系统崩溃只是暂停服务,数据还在,修复修复就好了。然而,如果...

Mysql中的bin log、redo log、undo log的区别

最近在整理面试题,在看mvcc的时候看到了undolog,今天索性把这三个log都记录一遍。MySQL的逻辑架构说之前先说一下MySQL的基本架构,MySQL主要分为两层:Server层和存储引...

binlog日志定时清理(binlog清理规则)

binlog日志binlog是MySQL数据库的一种日志文件,用于记录所有对数据的修改操作。binlog全称为binarylog,它以二进制格式记录MySQL服务器上所有的修改操作,包括对哪个数据库...

茶水间炸锅了!菜鸟误删用户表,运维老张的MySQL救命三招!

(公司茶水间,运维老张、开发小王和新人小李围着咖啡机)小李:(紧张兮兮)张哥!我...我好像把测试库的用户表删了!下午演示咋办啊?老张:(淡定喝咖啡)慌啥?昨晚的备份是吃干饭的?走,教你恢复!一、基础...

解决运维痛点,提高运维安全性-雷池 SafeLine WAF新功能身份认证

雷池介绍使用雷池SafeLineWAF已经两年多了,在1.5.x版本时就已经开始测试使用,并在推出LTS版本后转入LTS分支。近期雷池SafeLineWAF重点更新了身份认证功能,并提供了SS...

【Docker 新手入门指南】第十五章:常见故障排除

一、前期准备:收集关键信息在排查问题前,建议先获取以下系统数据,便于精准定位故障:1.系统基础信息#查看Docker版本(确认是否为最新稳定版)dockerversion#查看...

取消回复欢迎 发表评论: