HTTP API

介绍

HTTP代表超文本传输协议,是整个互联网的基础通信协议。即使这是您第一次使用HTTP,您可能理解的比您意识到的要多。在最基本的级别上,HTTP的工作方式如下:

  • 你好,服务器XYZ,请给我文件abc.html
  • “你好,小客户,是的,你可以,给你”

在PHP中有许多不同的方法来发送HTTP请求。WordPress HTTP API的目的是支持尽可能多的方法,并使用最适合特定请求的方法。

WordPress HTTP API还可以用于与其他API(如Twitter API或Google Maps API)进行通信和交互。

HTTP方法

HTTP有几个方法或动词,用于描述特定类型的操作。虽然还有几个,WordPress已经为三个最常见的功能预先构建好了。无论何时发出HTTP请求,都会传递一个方法,以帮助服务器确定客户端请求的操作类型。

GET(获取)

GET用于检索数据。这是迄今为止最常用的动词。每次查看网站或从API提取数据时,都会看到GET请求的结果。事实上,您的浏览器向您正在阅读本文的服务器发送了一个GET请求,并请求用于构建本文的数据。

岗位

POST用于向服务器发送数据,以便服务器以某种方式进行操作。例如,联系人表单。当您在表单字段中输入数据并单击提交按钮时,浏览器将获取数据,并用您在表单中输入的文本向服务器发送POST请求。服务器将从那里处理联系人请求。

头部

HEAD的知名度远低于其他两个。HEAD本质上与GET请求相同,只是它不检索数据,只检索有关数据的信息。这些数据描述了诸如数据上次更新的时间、客户端是否应该缓存数据、数据类型等内容。现代浏览器通常会向您以前访问过的页面发送HEAD请求,以确定是否有任何更新。如果没有,您实际上可能会看到以前下载的页面副本,而不是使用不必要的带宽拉入同一副本。

所有好的API客户端在执行GET请求之前都会利用HEAD来节省带宽。尽管如果HEAD说有新数据,它将需要两个单独的HTTP请求,但GET请求的数据大小可能非常大。只有当HEAD说数据是新的或不应该缓存时才使用GET,这将有助于节省昂贵的带宽和加载时间。

自定义方法

还有其他HTTP方法,如PUT、DELETE、TRACE和CONNECT。本文将不介绍这些方法,因为WordPress中没有预先构建的方法来使用它们,API也不常见。

根据服务器的配置方式,您还可以实现自己的其他HTTP方法。跳出标准方法总是一场赌博,并对创建客户端以使用您的站点或API的其他开发人员施加巨大的潜在限制,然而,您可以使用WordPress的任何方法。我们将在本文中简要介绍如何做到这一点。

响应代码

HTTP同时使用数字和字符串响应代码。这里是标准的响应代码,而不是对每种代码进行冗长的解释。您可以在创建API时定义自己的响应代码,但是,除非您需要支持特定类型的响应,否则最好坚持使用标准代码。自定义代码通常在1xx范围内。

代码类

三位数代码中最左边的数字可以快速看到响应类型。

状态代码描述
2倍请求成功
3xx个请求被重定向到另一个URL
4倍由于客户端错误,请求失败。通常身份验证无效或缺少数据
5xx年由于服务器错误,请求失败。配置文件通常丢失或配置错误

通用代码

这些是您将遇到的最常见的代码。

状态代码描述
200OK–请求成功
301资源已永久移动
302资源已临时移动
403禁止–通常是由于无效身份验证
404找不到资源
500内部服务器错误
503服务不可用

从API获取数据

github提供了一个优秀的API,它不需要为许多公共方面注册应用程序,因此为了演示其中一些方法,示例将以GitHub API为目标。

通过WordPress中的wp_remote_get()功能。此函数采用以下两个参数:

  1. $url–从中检索数据的资源。这必须是标准HTTP格式
  2. $args–可选–您可以在此处传递一组参数来更改行为和标头,如cookie、follow重定向等。

虽然可以通过$args参数进行更改,但假设使用以下默认值:

  • 方法–GET
  • timeout–5–放弃前等待的时间
  • 重定向–5–遵循重定向的次数。
  • httpversion–1.0版
  • blocking–true–页面的其余部分是否应该等待完成加载,直到此操作完成?
  • 标题–数组()
  • 正文–空
  • cookie–数组()

让我们使用GitHub用户帐户的URL,看看可以获得什么样的信息

$response=wp_remote_get('https://api.github.com/users/blobaugh网站' );


$response将包含有关我们请求的所有标头、内容和其他元数据

阵列([headers]=>数组([服务器]=>nginx[日期]=>2012年10月5日星期五04:43:50 GMT[content-type]=>application/json;字符集=utf-8[连接]=>关闭[状态]=>200 OK[变化]=>接受[x-ratelimit-remaining]=>4988[内容长度]=>594[最后修改]=>2012年10月5日星期五04:39:58 GMT[etag]=>“5d5e6f7a09462d6a2b473fb616a26d2a”[x-github-media-type]=>github.beta[缓存控制]=>公共,s-maxage=60,max-age=60[x-content-type-options]=>个[x-ratelimit-limit]=>5000)[body]=>{“type”:“User”,“login”:“blobaugh”,“gravatar_id”:“f25f324a47a1efdf7a745e0b2e3c878f”,“public_gists”:1,“followers”:22,“created_at”:“2011-05-23T21:38:50Z”,“public_repos”:31,“email”:“ben@lobaugh.net“,”可雇佣“:true,”博客“:”网址:http://ben.lobaugh.net“,”bio“:null,”following“:30,”name“:”Ben Lobaugh“,”company“:null,”avatar_url“:”https://secure.gravatar.com/avatar/f25f324a47a1efdf7a745e0b2e3c878f?d=https://a248.e.akamai.net/assets.github.com/2Images%2Gravatars%2Gravatar-user-420.png“,”id“:806179,”html_url“:”https://github.com/blobaugh网站“,”location“:null,”url“:”https://api.github.com/users/blobaugh网站"}[响应]=>数组([保留的文本5237511b45884ac6db1ff9d7e407f225/]=>200[消息]=>确定)[cookies]=>数组()[文件名]=>)


与前两个函数一样,可以在此函数上使用所有相同的助手函数。这里的例外是HEAD从不返回主体,因此该元素将始终为空。

得到你一直想要的身体

只有尸体可以用wp_remote_retrieve_body()。此函数只接受一个参数,即来自其他任何参数的响应wp_远程_X检索不是下一个值的函数。

$response=wp_remote_get('https://api.github.com/users/blobaugh网站' );$body=wp_remote_retrieve_body($response);


仍然使用上一示例中的GitHub资源,$body将是

{“type”:“User”,“login”:“blobaugh”,“public_repos”:31,“gravatar_id”:“f25f324a47a1efdf7a745e0b2e3c878f”,“followers”:22,“avatar_url”:“https://secure.gravatar.com/avatar/f25f324a47a1efdf7a745e0b2e3c878f?d=https://a248.e.akamai.net/assets.github.com/2Images%2Gravatars%2Gravatar-user-420.png“,”public_gists“:1,”created_at“:”2011-05-23T21:38:50Z“,”email“:”ben@lobaugh.net“,”following“:30,”name“:”Ben Lobaugh“,”company“:null,”hireable“:true,”id“:806179,”html_url“:”https://github.com/blobaugh,“博客”:网址:http://ben.lobaugh.net“,”location“:null,”bio“:null,”url“:”https://api.github.com/users/blobaugh网站"}


如果除了获取正文之外,您没有对响应执行任何其他操作,那么可以将代码减少为一行

$body=wp_remote_retrieve_body(wp_rmote_get('https://api.github.com/users/blobaugh网站' ) );


这些助手函数中的许多可以类似地在一行上使用。

获取响应代码

您可能需要检查响应代码以确保检索成功。这可以通过wp_remote_retrieve_response_code()功能:

$response=wp_remote_get('https://api.github.com/users/blobaugh网站' );$http_code=wp_remote_retrieve_response_code($response);


如果成功$http_代码将包含200.

获取特定标题

如果您希望检索特定的头,比如last-modified,可以使用wp_remote_retrieve_header()。此函数采用两个参数

  1. $响应–接听电话的响应
  2. $标题–要检索的标题的名称

检索最后修改的标题

$response=wp_remote_get('https://api.github.com/users/blobaugh网站' );$last_modified=wp_remote_retrieve_header($response,'last-modified');


$last_modified(上次修改)将包含[最后修改]=>2012年10月5日星期五04:39:58 GMT
您还可以使用wp_remote_retrieve_headers($response).

使用基本身份验证获取

受更多保护的API提供一种或多种不同类型的身份验证。HTTP基本身份验证是一种常见但不高度安全的身份验证方法。通过将“Authorization”传递给wp_remote_get()函数,以及其他HTTP方法函数。

$args=阵列(“headers”=>数组(“授权”=>“基本”。base64_encode(YOUR_USERNAME.':'.YOUR_PASSWORD)));wp_remote_get($url,$args);

将数据发布到API

相同的助手方法(wp_remote_retrieve_body()等)可用于所有HTTP方法调用,并以相同的方式使用。

POSTing数据使用wp_remote_post()函数,并采用与完全相同的参数wp_remote_get()。这里应该注意,您需要为第二个参数传入数组中的所有元素。Codex提供默认的可接受值。您现在只需关心发送的数据,其他值将被默认。

要向服务器发送数据,您需要构建一个关联的数据数组。此数据将分配给“主体”值。从服务器端来看,该值将显示在$_POST(发送)变量。即,如果body=>数组('myvar'=>5)在服务器上$_POST['myvar']=5.

由于GitHub不允许对上一示例中使用的API进行POSTing,因此本示例将假装这样做。通常,如果您想将数据POST到API,则需要联系API的维护人员并获取API密钥或其他形式的身份验证令牌。这简单地证明了您的应用程序可以像用户登录网站一样操作API上的数据。

假设我们提交的联系人表单包含以下字段:姓名、电子邮件、主题、评论。要设置车身,请执行以下操作:

$body=数组(“name”=>“Jane Smith”,'电子邮件'=>'some@email.com',“subject”=>“检查此API内容”,“comment”=>“我刚读了一本很棒的教程。你得去看看!',);


现在,我们需要设置将传递给的第二个参数的其余值wp_remote_post()

$args=阵列(“body”=>$body,“超时”=>“5”,'重定向'=>'5',“httpversion”=>“1.0”,“blocking”=>true,“headers”=>数组(),“cookie”=>数组(),);


那当然是打电话了

$response=wp_remote_post('http://your-contact-form.com',$args);

headding off带宽使用

在检索资源之前,使用HEAD检查资源状态可能非常重要,API有时会要求这样做。在高流量API上,GET通常限制为每分钟或每小时的请求数。甚至不需要尝试GET请求,除非HEAD请求显示API上的数据已更新。

如前所述,HEAD包含数据是否已更新、数据是否应缓存、缓存副本何时过期的数据,有时还包含对API请求的速率限制。

回到GitHub示例,这里有几个需要注意的标题。这些标头中的大多数都是标准的,但您应该始终检查API文档,以确保您了解哪些标头被命名为什么,以及它们的用途。

  • x速率极限–一段时间内允许的请求数
  • x速率限制-剩余–时间段内剩余可用请求的数量
  • 内容长度–内容的大小(以字节为单位)。如果内容相当大,可以向用户发出警告
  • 最后修改的–上次修改资源的时间。对缓存工具非常有用
  • 缓存控制–客户端应如何处理缓存

下面将检查我的GitHub用户帐户的HEAD值:

$response=wp_remote_head('https://api.github.com/users/blobaugh网站' );


$response应类似于

阵列([headers]=>数组([服务器]=>nginx[日期]=>2012年10月5日星期五05:21:26 GMT[content-type]=>application/json;字符集=utf-8[连接]=>关闭[状态]=>200正常[变化]=>接受[x-ratelimit-remaining]=>4982[内容长度]=>594[最后修改]=>2012年10月5日星期五04:39:58 GMT[etag]=>“5d5e6f7a09462d6a2b473fb616a26d2a”[x-github-media-type]=>github.beta[缓存控制]=>公共,s-maxage=60,max-age=60[x-content-type-options]=>个[x-ratelimit-limit]=>5000)[正文]=>[响应]=>数组([preserved_text 39a8515bd2dce2aa06ee8a2a6656b1de/]=>200[消息]=>确定)[cookies]=>数组()[文件名]=>)


与前两个函数一样,可以在此函数上使用所有相同的助手函数。这里的例外是HEAD从不返回主体,因此该元素将始终为空。

提出任何类型的请求

如果您需要使用上述任何函数都不支持的HTTP方法发出请求,请不要惊慌。开发WordPress的伟人已经想到了这一点,并且深情地提供了wp_remote_request()。此函数采用的两个参数与wp_remote_get(),并允许您指定HTTP方法。您需要传递什么数据取决于您的方法。

要发送DELETE方法示例,您可能具有类似于以下内容的内容:

$args=阵列(“method”=>“DELETE”,);$response=wp_remote_request('http://some-api.com/object/to/delete',$args);

缓存简介

缓存是一种实践,将常用对象或需要大量时间构建的对象保存到快速对象存储中,以便在以后的请求中快速检索。这避免了再次花费时间获取和构建对象。缓存是一个庞大的主题,它是网站优化的一部分,可以单独进入整个系列文章。下面只是对缓存的介绍,以及快速设置API响应缓存的简单而有效的方法。

为什么要缓存API响应?好吧,房间里的大象是因为外部API会减慢你的网站速度。许多顾问会告诉你,利用外部API将通过减少连接和处理量以及昂贵的带宽来提高网站的性能,但有时这根本不是事实。

这是服务器发送数据的速度与远程服务器处理请求、构建数据并将其发送回所需的时间之间的一个很好的平衡。第二个明显的方面是,许多API在一段时间内的请求数量有限,并且可能对应用程序一次连接的数量有限制。缓存通过在需要刷新数据之前将数据的副本放在服务器上来帮助解决这些难题。

你应该什么时候缓存?

简单的回答是“总是”,但有时你不应该这样做。如果您正在处理实时数据,或者API明确表示不在标头中缓存,您可能不想缓存,但对于所有其他情况,缓存从API检索的任何资源通常是一个好主意。

WordPress瞬态

WordPress瞬态提供了一种存储和使用缓存对象的便捷方法。瞬态在指定的时间内有效,或者直到API中的资源更新后需要它们过期。使用WordPress中的瞬态功能可能是您遇到过的最容易使用的缓存系统。只有三种功能可以为您完成所有繁重的工作。

缓存对象(设置瞬态)

缓存对象是使用set_transient()功能。此函数采用以下三个参数:

  1. $瞬态–瞬态名称供将来参考
  2. 价值$–瞬态值
  3. $过期–从保存瞬态到过期的秒数

将上面的GitHub用户信息响应缓存一小时的示例如下

$response=wp_remote_get('https://api.github.com/users/blobaugh网站' );set_transient('前缀_github_userinfo',$response,60*60);

获取缓存对象(获取瞬态)

获取缓存对象比设置瞬态要复杂得多。您需要请求瞬态,但还需要检查瞬态是否已过期,如果已过期,则获取更新的数据。通常情况下set_transient()调用是在获取瞬态()呼叫。以下是获取GitHub用户配置文件的瞬态数据的示例:

$github_userinfo=get_transient('前缀_github_用户信息');if(false===$github_userinfo){//瞬态过期,刷新数据$response=wp_remote_get('https://api.github.com/users/blobaugh网站' );set_transient('prefix_github_userinfo',$response,HOUR_IN_SECONDS);}//随意使用$github_userinfo

删除缓存对象(删除瞬态)

删除缓存的对象是所有瞬态函数中最容易的,只需向其传递瞬态名称的参数即可。

要删除Github用户信息:

delete_transient('blobaugh_github_userinfo');

可以找到更多有关瞬态的信息在这里.