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

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

nanshan 2024-10-21 06:03 29 浏览 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>

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

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

相关推荐

0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

生产环境starrocks 3.1存算一体集群部署

集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

在CentOS上添加swap虚拟内存并设置优先级

现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

国产深度(deepin)操作系统优化指南

1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

postgresql-15.4 多节点主从(读写分离)

1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

Docker 容器 Java 服务内存与 GC 优化实施方案

一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

虚拟内存设置、解决linux内存不够问题

虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

Elasticsearch性能调优(5):服务器配置选择

在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

Es如何落地

一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

针对Linux内存管理知识学习总结

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

MySQL进阶之性能优化

概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

Linux Cgroups(Control Groups)原理

LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

linux 常用性能优化参数及理解

1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

如何在 Linux 中使用 Sysctl 命令?

sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

取消回复欢迎 发表评论: