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

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

nanshan 2024-10-21 06:03 23 浏览 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服务器和客户机启用SSL?

用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...

Mysql5.7 出现大量 unauthenticated user

线上环境mysql5.7突然出现大量unauthenticateduser,进mysql,showprocesslist;解决办法有:在/etc/hosts中添加客户端ip,如192.16...

MySQL 在 Windows 系统下的安装(mysql安装教程windows)

更多技术文章MySQL在Windows系统下的安装1.下载mysql和Framework链接链接:百度网盘请输入提取码提取码:6w3p双击mysql-installer-communit...

MySql5.7.21.zip绿色版安装(mysql数据库绿色版安装)

1、去网上下载满足系统要求的版本(mysql-5.7.21-winx64.zip)2、直接解压3、mysql的初始化(1)以管理员身份运行cmd,在mysql中的bin目录下shift+右键-在...

MySQL(8.0)中文全文检索 (亲测有效)

在一堆文字中找到含有关键字的应用。当然也可以用以下语句实现:SELECT*FROM<表名>WHERE<字段名>like‘%ABC%’但是它的效率太低,是全盘扫描。...

新手教程,Linux系统下MySQL的安装

看了两三个教程。终于在哔哩哔哩找到一个简单高效的教程,成功安装,up主名叫bili逍遥bili,感兴趣可以去看看。下面这个是我总结的安装方法环境:CentOS764位1.下载安装包,个人觉得在...

麒麟服务器操作系统安装 MySQL 8 实战指南

原文连接:「链接」Hello,大家好啊,今天给大家带来一篇麒麟服务器操作系统上安装MySQL8的文章,欢迎大家分享点赞,点个在看和关注吧!MySQL作为主流开源数据库之一,被广泛应用于各种业务...

用Python玩转MySQL的全攻略,从环境搭建到项目实战全解析

这是一篇关于“MySQL数据库入门实战-Python版”的教程,结合了案例实战分析,帮助初学者快速掌握如何使用Python操作MySQL数据库。一、环境准备1.安装Python访问Pytho...

安装MySQL(中标麒麟 安装mysql)

安装MySQL注意:一定要用root用户操作如下步骤;先卸载MySQL再安装1.安装包准备(1)查看MySQL是否安装rpm-qa|grepmysql(2)如果安装了MySQL,就先卸载rpm-...

Mysql最全笔记,快速入门,干货满满,爆肝

目录一、MySQL的重要性二、MySQL介绍三、软件的服务架构四、MySQL的安装五、SQL语句六、数据库相关(DDL)七、表相关八、DML相关(表中数据)九、DQL(重点)十、数据完...

MAC电脑安装MySQL操作步骤(mac安装mysqldb)

1、在官网下载MySQL:https://dev.mysql.com/downloads/mysql/根据自己的macOS版本,选择适配的MySQL版本根据自己需求选择相应的安装包,我这里选择macO...

mysql主从(mysql主从切换)

1、本章面试题什么是mysql主从,主从有什么好处什么是读写分离,有什么好处,使用mycat如何实现2、知识点2.1、课程回顾dubboORM->MVC->RPC->SOApro...

【linux学习】以MySQL为例,带你了解数据库

做运维的小伙伴在日常工作中难免需要接触到数据库,不管是MySQL,mariadb,达梦还是瀚高等其实命令都差不多,下面我就以MySQL为例带大家一起来了解下数据库。有兴趣的小伙伴不妨评论区一起交流下...

玩玩WordPress - 环境简介(0)(玩玩网络科技有限公司)

简介提到开源博客系统,一般都会直接想到WordPress!WordPress是使用PHP开发的,数据库使用的是MySQL,一般会在Linux上运行,Nginx作为前端。这时候就需要有一套LNMP(Li...

服务器常用端口都有哪些?(服务器端使用的端口号范围)

下面为大家介绍一下,服务器常用的一些默认端口,以及他们的作用:  21:FTP服务所开放的端口,用于上传、下载文件。  22:SSH端口,用于通过命令行模式远程连接Linux服务器或vps。  23:...

取消回复欢迎 发表评论: