目录
为什么要休息?
HTTP
在工作中监视 HTTP
网址
HTTP 动词
获取
放置
删除
发布
HTTP 方法分类
安全和不安全的方法
幂等方法
表示
HTTP 客户端库
设置示例应用程序
Node.js 和 Express
PHP
示例应用程序如何工作
PHP
响应代码
200 好的
201已创建
400 错误请求
404 未找到
401 未经授权
405 方法不允许
409 冲突
500 内部服务器错误
练习示例应用程序
结论
首页 web前端 js教程 HTTP 和 REST:初学者基本指南

HTTP 和 REST:初学者基本指南

Sep 03, 2023 pm 12:13 PM

<p></p> <div data-content-block-type="Wysi" id="iqmv" class="content-block-wysi content-block"> <p>超文本传输​​协议 (HTTP) 是网络的生命。每次传输文档或发出 <code>AJAX</code> 请求时都会使用它。但令人惊讶的是,HTTP 在一些 Web 开发人员中相对陌生。</p> <p>本介绍将演示 REST 设计原则集如何支撑 HTTP。您将学习如何通过构建几乎可以在任何设备或操作系统上使用的界面来发挥其全部功能。</p> <p>Envato Market 还拥有数千个有用的代码脚本、插件和应用程序来帮助您进行 Web 开发,例如 Premium URL Shortener,这是一个 PHP 脚本,您可以将其安装在服务器上以创建自定义缩短的 URL。</p> <figure class="post_image"><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/164/169371438935450.jpg" class="lazy" alt="HTTP 和 REST:初学者基本指南"></figure> <h2 id="为什么要休息">为什么要休息?</h2> <p>REST 是一种组织独立系统之间交互的简单方法。自 2005 年以来,它越来越受欢迎,并激发了 Twitter API 等服务的设计。这是因为 REST 允许您以最小的开销与手机和其他网站等各种客户端进行交互。理论上,REST 并不依赖于 Web,但它几乎总是这样实现,并且受到 HTTP 的启发。因此,REST 可以用在任何可以使用 HTTP 的地方。</p> <p>另一种选择是在 HTTP 之上构建相对复杂的约定。通常,这会表现为全新的语言。最杰出的例子是 SOAP 和 GraphQL。您必须学习一套全新的约定,但您永远不会充分利用 HTTP。由于 REST 受到 HTTP 的启发并发挥了其优势,因此它是了解 HTTP 工作原理的最佳方式。</p> <p>初步概述后,我们将检查每个 HTTP 构建块:URL、HTTP 动词和响应代码。我们还将回顾如何以 RESTful 方式使用它们。在此过程中,我们将通过示例应用程序来说明该理论,该应用程序模拟通过 Web 界面跟踪与公司客户相关的数据的过程。</p> <h2 id="HTTP">HTTP</h2> <p>HTTP 是允许在网络上来回发送文档的协议。协议是一组规则,用于确定可以交换哪些消息以及哪些消息是对其他消息的适当回复。另一个常见的协议是 POP3,您可以使用它来获取硬盘上的电子邮件。</p> <p>在HTTP中,有两种不同的角色:服务器和客户端。一般来说,谈话总是由客户发起;服务器回复。 HTTP 是基于文本的;也就是说,消息本质上是文本位,尽管消息正文也可以包含其他媒体。使用文本可以轻松监控 HTTP 交换。</p> <p>HTTP 消息由标头和正文组成。身体常常是空的;它包含您想要通过网络传输的数据,以便根据标头中的说明使用它。 header包含元数据,例如编码信息;但是,对于请求,它还包含重要的 HTTP 方法。在 REST 风格中,您会发现标头数据通常比正文更重要。</p> <h2 id="在工作中监视-HTTP">在工作中监视 HTTP</h2> <p>如果您使用 Chrome 或 Firefox 开发者工具,请点击顶部栏上的<strong>网络</strong>以查看您当前所在网站中的 HTTP 请求。您可能需要在打开的网络开发人员工具的情况下刷新页面才能查看日志。例如:</p> <p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/164/169371438977748.png" class="lazy" alt="HTTP 和 REST:初学者基本指南"></p> <p>熟悉 HTTP 的另一个有用方法是使用专用客户端,例如 cURL。 cURL 是一个命令行工具,可在所有主要操作系统上使用。</p> <p>安装 cURL 后,输入:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v google.com </pre><div class="contentsignin">登录后复制</div></div> <p>这将显示完整的 HTTP 对话。请求前面是 <code>></code>,而响应前面是 <code><</code>。</p> <h2 id="网址">网址</h2> <p>URL 是您识别要操作的内容的方式。我们说每个 URL 标识一个资源。这些 URL 与分配给网页的 URL 完全相同。事实上,网页是一种资源。</p> <p>让我们举一个更奇特的例子,考虑我们的示例应用程序,它管理公司的客户列表。 <code>/clients</code> 将识别所有客户端,而 <code>/clients/jim</code> 将识别名为“Jim”的客户端,假设他是唯一具有该名称的客户端。</p> <p>在这些示例中,我们通常不会在 URL 中包含主机名,因为从界面组织方式的角度来看,它无关紧要。尽管如此,主机名对于确保资源标识符在整个网络上是唯一的很重要。我们经常说您将资源请求发送到主机。主机与资源路径分开包含在标头中,资源路径位于请求标头的正上方:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>GET /clients/jim HTTP/1.1 Host: example.com </pre><div class="contentsignin">登录后复制</div></div> <p>资源最好被视为名词。例如,以下内容不是 RESTful:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>/clients/add </pre><div class="contentsignin">登录后复制</div></div> <p>这是因为它使用 URL 来描述操作。这是区分 RESTful 和非 RESTful 系统的一个相当基本的点。</p> <p>最后,URL 应根据需要尽可能精确;唯一标识资源所需的所有内容都应包含在 URL 中。您不需要在请求中包含标识资源的数据。这样,URL 就可以充当应用程序处理的所有数据的完整映射。</p> <p>但是如何指定操作呢?例如,您怎么说您希望创建而不是检索新的客户记录?这就是 HTTP 动词发挥作用的地方。</p> <h2 id="HTTP-动词">HTTP 动词</h2> <p>每个请求在请求标头中指定特定的 HTTP 动词或方法。这是请求标头中的第一个全大写单词。例如,<code>GET / HTTP/1.1</code> 表示正在使用 GET 方法,而 <code>DELETE /clients/anne HTTP/1.1</code> 表示正在使用 <code>DELETE</code> 方法。</p> <p>HTTP 动词告诉服务器如何处理 URL 标识的数据。请求可以选择在其正文中包含执行操作可能需要的其他信息,例如您想要与资源一起存储的数据。您可以使用 <code>-d</code> 选项在 cURL 中提供此数据。</p> <p>如果您曾经创建过 HTML 表单,您就会熟悉两个最重要的 HTTP 动词:<code>GET</code> 和 <code>POST</code>。但可用的 HTTP 动词要多得多。构建 RESTful API 最重要的是 <code>GET</code>、<code>POST</code>、<code>PUT</code> 和 <code>DELETE</code>。还有其他方法,例如 <code>HEAD</code> 和 <code>OPTIONS</code>,但比较少见。如果您想了解所有其他 HTTP 方法,官方来源是 IETF。</p> <h3 id="获取">获取</h3> <p><code>GET</code> 是最简单的 HTTP 请求方法,浏览器每次单击链接或在地址栏中输入 URL 时都会使用该方法。它指示服务器将 URL 标识的数据传输到客户端。切勿因 <code>GET</code> 请求而在服务器端修改数据。从这个意义上说,<code>GET</code> 请求是只读的,但是当然,一旦客户端收到数据,它就可以自由地在自己这边对其进行任何操作 - 例如,将其格式化以供显示。</p > <h3 id="放置">放置</h3> <p>当您希望创建或更新由 URL 标识的资源时,将使用 <code>PUT</code> 请求。例如, <code>PUT /clients/robin</code> 可能会在服务器上创建一个名为 Robin 的客户端。您会注意到 <code>REST</code> 完全与后端无关;请求中没有任何内容告诉服务器应该如何创建数据——只是告诉服务器应该如何创建数据。这使您可以在需要时轻松更换后端技术。 <code>PUT</code> 请求包含在主体中更新或创建资源时使用的数据。在 cURL 中,您可以使用 <code>-d</code> 开关将数据添加到请求:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v -X PUT -d "some text" </pre><div class="contentsignin">登录后复制</div></div> <h3 id="删除">删除</h3> <p><code>DELETE</code> 应该执行与 <code>PUT</code> 相反的操作;当您想要删除由请求的 URL 标识的资源时,应该使用它。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v -X DELETE /clients/anne </pre><div class="contentsignin">登录后复制</div></div> <p>这将删除与该资源关联的所有数据,由 <code>/clients/anne</code> 标识。</p> <h3 id="发布">发布</h3> <p><code>POST</code> 当您希望在服务器上进行的处理应该重复时使用,如果 <code>POST</code> 请求被重复(也就是说,它们不是<em>幂等</em>;更多内容请参见下文) )。此外,<code>POST</code> 请求应导致将请求正文作为您要发布到的 URL 的下属进行处理。</p> <p>简单来说,<code>POST /clients/</code> 不应导致 <code>/clients/</code> 本身的资源被修改,而是 URL <em>以 </em><code>/clients/ 开头的资源被修改</code>。例如,它可以将一个新客户端附加到列表中,并使用服务器生成的 <code>id</code>:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>/clients/some-unique-id </pre><div class="contentsignin">登录后复制</div></div> <p><code>PUT</code> 请求很容易使用,而不是 <code>POST</code> 请求,反之亦然。有些系统仅使用一个,有些系统使用 <code>POST</code> 进行创建操作,使用 <code>PUT</code> 进行更新操作(因为 <code>PUT</code> 要求您始终提供完整的 URL),有些系统甚至使用 <code>POST</code> 进行更新,并使用 <code>PUT</code>用于创建。</p> <p>通常,<code>POST</code> 请求用于触发服务器上不符合 <code>Create/Update/Delete</code> 范例的操作,但这超出了 <code>REST</code> 的范围。在我们的示例中,我们将始终使用 <code>PUT</code>。</p> <h2 id="HTTP-方法分类">HTTP 方法分类</h2> <h4 id="strong-安全和不安全的方法-strong"><strong>安全和不安全的方法</strong></h4> <p>安全方法是那些从不修改资源的方法。从上面列出的四种方法中,唯一安全的方法是 <code>GET</code>。其他的不安全,因为它们可能会导致资源的修改。</p> <h4 id="strong-幂等方法-strong"><strong>幂等方法</strong></h4> <p>无论重复请求多少次,这些方法都会获得相同的结果:它们是 <code>GET</code>、<code>PUT</code> 和 <code>DELETE</code>。唯一的非幂等方法是 <code>POST</code>。</p> <p><code>PUT</code> 和 <code>DELETE</code> 被认为是幂等的可能会令人惊讶,但这很容易解释。使用相同的主体重复 <code>PUT</code> 方法应该以与上一个 <code>PUT</code> 请求中描述的方式相同的方式修改资源:不会有任何改变!同样,删除一个资源两次也是没有意义的。因此,无论重复 <code>PUT</code> 或 <code>DELETE</code> 请求多少次,结果都应该与只执行一次相同。</p> <p><strong>记住:</strong>最终决定使用某种 HTTP 方法时会发生什么情况的是程序员。 HTTP 实现中没有任何固有的东西会自动导致资源被创建、列出、删除或更新。您必须小心地正确应用 HTTP 协议并自行强制执行这些语义。</p> <h2 id="表示">表示</h2> <p>我们可以通过以下方式总结到目前为止所学到的知识:HTTP 客户端和 HTTP 服务器交换有关由 URL 标识的资源的信息。</p> <p>我们说请求和响应包含资源的表示。通过表示,我们指的是某种格式的有关资源状态或该状态未来应如何的信息。标头和正文都是表示的一部分。</p> <p>包含元数据的 HTTP 标头由 HTTP 规范严格定义;它们只能包含纯文本,并且必须以某种方式格式化。</p> <p>正文可以包含任何格式的数据,这就是 HTTP 真正发挥作用的地方。您知道可以用任何人类语言发送纯文本、图片、HTML 和 XML。通过请求元数据或不同的 URL,您可以选择同一资源的不同表示形式。例如,您可以将网页发送到浏览器,并将 JSON 发送到应用程序。</p> <p>HTTP 响应应指定正文的内容类型。这是在标头的 <code>Content-Type</code><em> </em> 字段中完成的。例如:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>Content-Type: application/json </pre><div class="contentsignin">登录后复制</div></div> <p>为简单起见,我们的示例应用程序仅来回发送 JSON,但应用程序的设计方式应使您可以轻松更改数据格式,以适应不同的客户端或用户偏好。</p> <h2 id="HTTP-客户端库">HTTP 客户端库</h2> <p>要尝试不同的请求方法,您需要一个客户端,它允许您指定要使用的方法。不幸的是,HTML 表单不符合要求,因为它们只允许您发出 GET 和 POST 请求。在现实生活中,API 是通过单独的客户端应用程序或通过浏览器中的 JavaScript 以编程方式访问的。</p> <p>这就是为什么除了服务器之外,在您选择的编程语言中拥有良好的 HTTP 客户端功能也很重要。</p> <p>一个非常流行的 HTTP 客户端库是 cURL。您已经在本教程前面熟悉了 cURL 命令。 cURL 包括一个独立的命令行程序和一个可供各种编程语言使用的库。特别是,cURL 通常是 PHP 开发人员选择的 HTTP 客户端解决方案。其他语言(例如 Python)提供更多本机 HTTP 客户端库。</p> <h2 id="设置示例应用程序">设置示例应用程序</h2> <p>现在我们将构建一个准系统示例应用程序。您可以按照相应部分并使用代码附件中的相应文件夹,在 Node.js 或 PHP 中构建示例应用程序。两个应用程序的工作方式相同。如果您不确定选择哪个,Node.js 可能是更好的选择,因为它现在更常用。</p> <h3 id="Node-js-和-Express">Node.js 和 Express</h3> <p>为了运行示例应用程序,您需要安装 Node.js。完成后,打开源代码附件中的 <strong>node.js</strong> 目录并运行 <code>npm install</code>。</p> <h3 id="span-PHP-span"><span>PHP</span></h3> <p>要运行示例应用程序,您需要安装 PHP 5 和具有某种运行 PHP 机制的 Web 服务器。当前版本必须至少为 5.2 版本才能访问 <code>json_encode()</code> 和 <code>json_decode()</code> 函数。</p> <p>对于服务器,最常见的选择仍然是 Apache 和 <code>mod_php</code>,但您可以自由地使用您喜欢的任何替代方案。有一个 Apache 配置示例,其中包含重写规则,可帮助您快速设置应用程序。对任何以 <strong>/clients/</strong> 开头的 URL 的所有请求都必须路由到我们的 <strong>server.php</strong><em> </em>文件。</p> <p>在 Apache 中,您需要启用 <code>mod_rewrite</code><em> </em> 并将提供的 <code>mod_rewrite</code><em> </em> 配置放在您的 Apache 配置或 <strong>.htacess</strong> 中的某个位置</strong ><em></em>文件。这样,<strong>server.php</strong><em> </em>将响应来自服务器的所有请求。必须使用 Nginx 或您决定使用的任何替代服务器来实现同样的效果。</p> <h2 id="示例应用程序如何工作">示例应用程序如何工作</h2> <h3 id="Node-js-和-Express">Node.js 和 Express</h3> <p>如果你查看代码,你会看到一些不同的方法,例如 <code>app.get</code> 或 <code>app.put</code>。这些是不同的路线。每个路由都匹配特定的 URL 和 HTTP 方法。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>app.get("/clients", (_, res) => { ... }); app.get("/clients/:client", (req, res) => { ... }); app.put("/clients/:client", (req, res) => { ... }); app.delete("/clients/:client", (req, res) => { ... }); </pre><div class="contentsignin">登录后复制</div></div> <p>您可能已经注意到 URL 中的 <code>:client</code> 。这是一个参数,这意味着 URL 该部分中的任何内容都将与该路由匹配,并且 URL 该部分将作为参数传递。在路由处理函数内部,您可以看到描述逻辑的注释。最后是<code>app.listen</code>。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>app.listen(port, () => { console.log(`Example app listening on port ${port}`); }); </pre><div class="contentsignin">登录后复制</div></div> <p>这将在 <code>port</code> 指定的端口启动服务器。回调函数在服务器启动后执行。</p> <h3 id="PHP">PHP</h3> <p>以 REST 方式处理请求有两个关键。第一个关键是根据 HTTP 方法启动不同的处理 - 即使 URL 相同。在 PHP 中,<em><code>$_SERVER</code> 全局数组中有一个变量,用于确定使用哪种方法发出请求:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$_SERVER['REQUEST_METHOD'] </pre><div class="contentsignin">登录后复制</div></div> <p>此变量包含字符串形式的方法名称,例如 <code>'GET'</code>、<code>'PUT'</code> 等。</p> <p>另一个关键是知道请求的是哪个 URL。为此,我们使用另一个标准 PHP 变量:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$_SERVER['REQUEST_URI'] </pre><div class="contentsignin">登录后复制</div></div> <p>此变量包含从第一个正斜杠开始的 URL。例如,如果主机名是 <code>example.com</code>,则 <code>'https://example.com/'</code> 将返回 <code>'/'</code>,而 <code>'http://example.com/test/ '</code> 将返回 <code>'/test/'</code>。</p> <p>我们首先尝试确定调用了哪个 URL。我们只考虑以 <code>'clients'</code> 开头的 URL。其他均无效。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$resource = array_shift($paths); if ($resource == 'clients') { $name = array_shift($paths); if (empty($name)) { $this->handle_base($method); } else { $this->handle_name($method, $name); } } else { // We only handle resources under 'clients' header('HTTP/1.1 404 Not Found'); } </pre><div class="contentsignin">登录后复制</div></div> <p>我们有两种可能的结果:</p> <ul> <li>资源就是客户,在这种情况下,我们会返回完整的列表。</li> <li>还有一个进一步的标识符。</li> </ul> <p>如果有其他标识符,我们假设它是客户端的名称,并再次将其转发到不同的函数,具体取决于 <code> 方法 </code>。我们使用 <code>switch</code> 语句,在实际应用程序中应该避免这种情况:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>switch($method) { case 'PUT': $this->create_contact($name); break; case 'DELETE': $this->delete_contact($name); break; case 'GET': $this->display_contact($name); break; default: header('HTTP/1.1 405 Method Not Allowed'); header('Allow: GET, PUT, DELETE'); break; } </pre><div class="contentsignin">登录后复制</div></div> <h2 id="响应代码">响应代码</h2> <p>您可能已经注意到,示例应用程序使用 PHP <code>header()</code>,传递一些看起来奇怪的字符串作为参数。 <code>header()</code><em> </em>函数打印 HTTP <code>headers</code> 并确保它们的格式正确。标头应该是响应中的第一件事,因此在完成标头之前不应输出任何其他内容。有时,除了您在代码中指定的标头之外,您的 HTTP 服务器可能会配置为添加其他标头。</p> <p>标头包含各种元信息,例如消息正文中使用的文本编码或正文内容的 MIME 类型。在本例中,我们显式指定 HTTP 响应代码。 HTTP 响应代码标准化了一种通知客户端请求结果的方法。默认情况下,PHP返回<code>200</code>响应码,表示响应成功。</p> <p>服务器应该返回最合适的HTTP响应代码;这样,客户端可以尝试修复其错误(假设有任何错误)。大多数人都熟悉常见的 <code>404 Not Found</code> 响应代码,但还有更多可用的代码可以适应各种情况。</p> <p>请记住,HTTP 响应代码的含义并不是非常精确;这是 HTTP 本身相当通用的结果。您应该尝试使用与当前情况最匹配的响应代码。话虽如此,如果您找不到完全合适的产品,也不必太担心。</p> <p>以下是一些经常与 REST 一起使用的 HTTP 响应代码:</p> <h3 id="好的">200 好的</h3> <p>此响应代码表明请求成功。</p> <h3 id="已创建">201已创建</h3> <p>这表明请求成功并且资源已创建。用于确认 <code>PUT</code> 或 <code>POST</code> 请求是否成功。</p> <h3 id="错误请求">400 错误请求</h3> <p>请求格式错误。当数据未通过验证或格式错误时,尤其是在 <code>POST</code> 和 <code>PUT</code> 请求中,会发生这种情况。</p> <h3 id="未找到">404 未找到</h3> <p>此响应表明无法找到所需的资源。这通常会返回给所有指向没有相应资源的 URL 的请求。</p> <h3 id="未经授权">401 未经授权</h3> <p>此错误表明您需要在访问资源之前执行身份验证。</p> <h3 id="方法不允许">405 方法不允许</h3> <p>此资源不支持所使用的 HTTP 方法。</p> <h3 id="冲突">409 冲突</h3> <p>这表明存在冲突。例如,您使用 <code>PUT</code> 请求两次创建相同的资源。</p> <h3 id="内部服务器错误">500 内部服务器错误</h3> <p>当一切都失败时;一般情况下,500响应是由于服务器端出现意外情况导致处理失败,导致服务器出错时使用的。</p> <h2 id="练习示例应用程序">练习示例应用程序</h2> <p>我们首先从应用程序中获取信息。我们需要客户端 <code>'jim'</code> 的详细信息,因此让我们向此资源的 URL 发送一个简单的 <code>GET</code> 请求:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v http://localhost:80/clients/jim </pre><div class="contentsignin">登录后复制</div></div> <p>这将显示完整的消息标题。响应中的最后一行将是消息正文;在本例中,它将是包含 Jim 地址的 JSON(请记住,省略方法名称将导致 <code>GET</code> 请求;同时将 <code>localhost:80</code> 替换为您正在使用的服务器名称和端口)。</p> <p>接下来,我们可以一次性获取所有客户的信息:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v http://localhost:80/clients/ </pre><div class="contentsignin">登录后复制</div></div> <p>然后我们创建一个新客户端,名为 Paul:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v -X "PUT" http://localhost:80/clients/paul -d '{"address":"Sunset Boulevard" }' -H 'content-type: application/json' </pre><div class="contentsignin">登录后复制</div></div> <p>现在您将收到包含 Paul 的所有客户的列表作为确认。</p> <p>最后,删除客户端:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v -X "DELETE" http://localhost:80/clients/anne </pre><div class="contentsignin">登录后复制</div></div> <p>您会发现返回的JSON不再包含有关Anne的任何数据。</p> <p>如果您尝试检索不存在的客户端,例如:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v http://localhost:80/clients/jerry </pre><div class="contentsignin">登录后复制</div></div> <p>您将收到 404 错误,而如果您尝试创建已存在的客户端:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>curl -v -X "PUT" http://localhost:80/clients/anne </pre><div class="contentsignin">登录后复制</div></div> <p>您将收到 409 错误。</p> <h2 id="结论">结论</h2> <p>重要的是要记住,HTTP 被设计为在除了对协议的理解之外不共享任何内容的系统之间进行通信。一般来说,您对 HTTP 之外的假设越少越好:这允许最广泛的程序和设备访问您的 API。</p> <p>我在本教程中使用了 PHP,因为它很可能是 Envato Tuts+ 读者最熟悉的语言。也就是说,PHP 虽然是为 Web 设计的,但在以 REST 方式工作时可能不是最好的语言,因为它处理 <code>PUT</code> 请求的方式与 <code>GET</code> 和 <code>POST</code> 完全不同。</p> <p>除了 PHP 和 Node.js,您还可以考虑以下内容:</p> <ul> <li> 寻求更高性能的网络服务器。</li> <li>各种 Ruby 框架(Rails 和 Sinatra)。</li> <li>Python,因为它具有良好的 REST 支持。普通 Django 和 WebOb 或 Werkzeug 应该可以工作。</li> </ul> <p>在尝试遵守 REST 原则的应用程序中,典型的例子是 Atom 发布协议,尽管老实说它在实践中使用得并不频繁。对于基于充分使用 HTTP 理念构建的现代应用程序,请参阅 Apache CouchDB。</p> <p>玩得开心!</p> <p><em>本文已根据雅各布·杰克逊 (Jacob Jackson) 的贡献进行了更新。 Jacob 是一名 Web 开发人员、技术作家和频繁的开源贡献者。</em></p> </div>

以上是HTTP 和 REST:初学者基本指南的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在JavaScript中替换字符串字符 在JavaScript中替换字符串字符 Mar 11, 2025 am 12:07 AM

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

构建您自己的Ajax Web应用程序 构建您自己的Ajax Web应用程序 Mar 09, 2025 am 12:11 AM

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10个JQuery Fun and Games插件 10个JQuery Fun and Games插件 Mar 08, 2025 am 12:42 AM

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

jQuery视差教程 - 动画标题背景 jQuery视差教程 - 动画标题背景 Mar 08, 2025 am 12:39 AM

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

如何创建和发布自己的JavaScript库? 如何创建和发布自己的JavaScript库? Mar 18, 2025 pm 03:12 PM

文章讨论了创建,发布和维护JavaScript库,专注于计划,开发,测试,文档和促销策略。

如何在浏览器中优化JavaScript代码以进行性能? 如何在浏览器中优化JavaScript代码以进行性能? Mar 18, 2025 pm 03:14 PM

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

Matter.js入门:简介 Matter.js入门:简介 Mar 08, 2025 am 12:53 AM

Matter.js是一个用JavaScript编写的2D刚体物理引擎。此库可以帮助您轻松地在浏览器中模拟2D物理。它提供了许多功能,例如创建刚体并为其分配质量、面积或密度等物理属性的能力。您还可以模拟不同类型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流浏览器。此外,它也适用于移动设备,因为它可以检测触摸并具有响应能力。所有这些功能都使其值得您投入时间学习如何使用该引擎,因为这样您就可以轻松创建基于物理的2D游戏或模拟。在本教程中,我将介绍此库的基础知识,包括其安装和用法,并提供一

使用jQuery和Ajax自动刷新DIV内容 使用jQuery和Ajax自动刷新DIV内容 Mar 08, 2025 am 12:58 AM

本文演示了如何使用jQuery和ajax自动每5秒自动刷新DIV的内容。 该示例从RSS提要中获取并显示了最新的博客文章以及最后的刷新时间戳。 加载图像是选择

See all articles