”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > HTTP方法和代码

HTTP方法和代码

发布于2025-02-10
浏览:223

Http methods and codes

HTTP 方法用于指示 API 客户端希望对给定资源执行的操作。每个 HTTP 方法都对应一个特定的操作,例如创建、读取、更新或删除资源,并且每个对 REST API 的请求都必须包含 HTTP 方法。

HTTP 协议的工作原理是客户端向服务器发送请求,服务器响应这些请求。我们通过使用不同 HTTP 方法(有时称为 HTTP 动词)发送 HTTP 请求来执行 CRUD 操作(创建、读取、更新、删除)。GET 和 POST 是最常用的 HTTP 方法,但还有更多 HTTP 方法需要学习。本文将介绍不同的 HTTP 方法以及在构建和使用 Web API 时如何使用它们。

您应该了解的 9 种 HTTP 方法

1. GET 方法

如果我们想从资源(如网站、服务器或 API)检索数据,我们会向它们发送 GET 请求。例如,如果我们想要客户列表或特定客户,我们会向服务器发送 GET 请求。

由于 GET 方法不应该更改资源上的数据,而只是读取它们(只读),因此它被认为是安全方法。此外,GET 方法是幂等的。

如何使用 GET 方法测试 API?

当我们想要测试 API 时,我们最常用的方法是 GET 方法。因此,我们期望发生以下情况:

如果资源可访问,API 将返回 200 状态代码,表示“OK”。

除了 200 状态代码外,服务器通常还会返回 XML 或 JSON 格式的响应正文。例如,我们期望 [/members] 端点返回 XML 或 JSON 格式的成员列表。

如果服务器不支持该端点,则服务器将返回 404 状态代码,表示“未找到”。

如果我们以错误的语法发送请求,服务器将返回 400 状态代码,表示“错误请求”。

2. POST 方法

POST 方法在后端(服务器)创建新的资源。请求正文承载我们想要发送到服务器的数据。它既不是安全方法也不是幂等方法。我们不期望每次发送 POST 请求都能获得相同的结果。例如,两个相同的 POST 请求将创建两个具有相同数据和不同资源 ID 的新的等效资源。

向服务器发送 POST 请求时,我们期望发生以下情况:

理想情况下,如果 POST 请求在另一端创建了一个新的资源,则响应应该带有 201 状态代码,表示“已创建”。

有时,执行 POST 请求不会在给定的 URL 返回资源;在这种情况下,该方法将返回 204 状态代码,表示“无内容”。

如何测试 POST 端点

由于 POST 方法创建数据,我们必须谨慎更改数据;强烈建议测试 API 中的所有 POST 方法。此外,请确保在测试完成后删除已创建的资源。

以下是一些我们可以用来测试使用 POST 方法的 API 的建议:

使用 POST 方法创建一个资源,它应该返回 201 状态代码。

执行 GET 方法以检查是否成功创建了资源。您应该获得 200 状态代码,并且响应应该包含已创建的资源。

使用不正确或格式错误的数据执行 POST 方法以检查操作是否失败。

3. PUT 方法

使用 PUT 请求方法,我们可以通过将更新后的数据作为请求正文的内容发送到服务器来更新现有资源。PUT 方法通过完全替换其全部内容来更新资源。如果它应用于资源集合,它将替换整个集合,因此请小心使用它。服务器在成功更新现有资源后将返回 200 或 204 状态代码。

如何使用 PUT 方法测试 API?

PUT 方法是幂等的,它修改整个资源,因此为了测试该行为,我们确保执行以下操作:

多次向服务器发送 PUT 请求,它应该始终返回相同的结果。

当服务器完成 PUT 请求并更新资源时,响应应该带有 200 或 204 状态代码。

服务器完成 PUT 请求后,发出 GET 请求以检查资源上的数据是否已正确更新。

如果输入无效或格式错误,则不得更新资源。

4. PATCH 方法

PATCH 是另一种不常用的 HTTP 方法。与 PUT 类似,PATCH 更新资源,但它仅部分更新数据,而不是全部更新。例如,为了更精确起见,请求 [PUT] customers/{customerid} 将完全更新资源上 Customers 实体中的字段。但是,PATCH 方法确实会更新客户实体的提供的字段。通常,此修改应采用标准格式,例如 JSON 或 XML。

如何使用 PATCH 方法测试 API?

要使用 PATCH 方法测试 API,请按照本文中讨论的步骤进行操作,以使用 PUT 和 POST 方法测试 API。考虑以下结果:

向服务器发送 PATCH 请求;服务器将返回 2xx HTTP 状态代码,这意味着:请求已成功接收、理解和接受。

执行 GET 请求并验证内容是否已正确更新。

如果请求有效负载不正确或格式错误,则操作必须失败。

5. DELETE 方法

顾名思义,DELETE 方法删除资源。DELETE 方法是幂等的;无论调用次数多少,它都返回相同的结果。

大多数 API 总是返回 200 状态代码,即使我们尝试删除已删除的资源也是如此,但在某些 API 中,如果目标数据不再存在,则方法调用将返回 404 状态代码。

如何测试 DELETE 端点?

在服务器上删除某些内容时,我们应该谨慎。我们正在删除数据,这至关重要。首先,确保删除数据是可以接受的,然后执行以下操作:

调用 POST 方法以创建新的资源。切勿使用实际数据测试 DELETE。例如,首先创建一个新客户,然后尝试删除您刚刚创建的客户。

对特定资源发出 DELETE 请求。例如,请求 [DELETE] /customers/{customer-id} 删除具有指定客户 ID 的客户。

对已删除的客户调用 GET 方法,它应该返回 404,因为资源不再存在。

6. HEAD 方法

HEAD 方法类似于 GET 方法。但它没有任何响应正文,因此如果它错误地返回响应正文,则必须忽略它。例如,[GET] /customers 端点在其响应正文中返回客户列表。此外,[HEAD] /customers 也执行相同的操作,但它不返回客户列表。在请求 GET 端点之前,我们可以发出 HEAD 请求以确定我们正在下载的文件或数据的大小(Content-length)。因此,HEAD 方法是安全且幂等的。

如何测试 HEAD 端点

HEAD 方法的优点之一是,只要 API 支持它,我们就可以测试服务器是否可用和可访问,并且它比 GET 方法快得多,因为它没有响应正文。我们期望从 API 获取的状态代码是 200。在每种其他 HTTP 方法之前,我们都可以先使用 HEAD 方法测试 API。

7. OPTIONS 方法

我们使用此方法来获取有关服务器中给定 URL 的可能的通信选项(允许的 HTTP 方法)的信息,或者使用星号来指代整个服务器。此方法是安全且幂等的。

各种浏览器广泛使用 OPTIONS 方法来检查目标 API 上的 CORS(跨源资源共享)操作是否受限。

如何测试 OPTIONS 端点

根据服务器是否支持 OPTIONS 方法,我们可以使用 OPTIONS 方法测试服务器的致命故障次数。要尝试它,请考虑以下几点:

发出 OPTIONS 请求并检查返回的标头和状态代码。

测试使用不支持 OPTIONS 方法的资源的失败情况。

8. TRACE 方法

TRACE 方法用于诊断目的。它使用与客户端之前发送到服务器的请求正文相同的请求正文创建一个环回测试,并且成功的响应代码是 200 OK。TRACE 方法是安全且幂等的。

TRACE 方法可能很危险,因为它可能会泄露凭据。黑客可以使用客户端攻击窃取凭据,包括内部身份验证标头。

如何使用 TRACE 方法测试 API?

发出标准 HTTP 请求,例如对 /api/status 的 GET 请求

将 GET 替换为 TRACE 并再次发送。

检查服务器返回的内容。如果响应与原始请求具有相同的信息,则服务器中启用了 TRACE 功能并且工作正常。

9. CONNECT 方法

CONNECT 方法用于在客户端和服务器之间建立端到端连接。它在它们之间建立双向连接,就像隧道一样。例如,我们可以使用此方法在客户端和服务器之间安全地传输大型文件。

HTTP 方法比较

方法 摘要 CRUD 接受请求正文 幂等 安全 GET 获取单个资源或资源组 读取 否 是 是 PUT 一次性更新整个资源 更新 是 是 否 POST 创建新资源 创建 是 否 否 PATCH 部分更新资源 更新 是 否 否 DELETE 删除资源 删除 否 是 否 OPTIONS 获取有关允许的操作的信息 读取 否 是 是 HEAD 获取端点的元数据 读取 否 是 是 TRACE 用于诊断目的 读取 否 是 是 CONNECT 在客户端和资源之间建立双向连接 - 否 - -

最新教程 更多>
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-04-27
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-27
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-04-27
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-27
  • 在Java中如何为PNG文件添加坐标轴和标签?
    在Java中如何为PNG文件添加坐标轴和标签?
    如何用java 在现有png映像中添加轴和标签的axes和labels如何注释png文件可能具有挑战性。与其尝试可能导致错误和不一致的修改,不如建议在图表创建过程中集成注释。使用JFReechArt import java.awt.color; 导入java.awt.eventqueue; 导入...
    编程 发布于2025-04-27
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-27
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-27
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击单击单个鼠标单击单击单击?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(document.Selection){...
    编程 发布于2025-04-27
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-04-27
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-04-27
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-04-27
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-04-27
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-27
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-04-27
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-04-27

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3