题
解决方案
Drupal具有特定的功能,可以帮助与Web服务交流并处理JSON输入。
Drupal 7具有以下功能:
- drupal_http_request() 是向远程站点提出HTTP请求的功能,并且它处理,发布,放置或任何其他HTTP请求;它还处理重定向。
- drupal_http_build_query() 转换一个阵列
rawurlencode()
-d字符串。 - drupal_json_decode() 在PHP代码中解码JSON字符串。
- drupal_json_encode() 将PHP变量编码为由JSON处理的字符串。
使用这些功能,您可以编写自己的自定义模块,以向实现Web服务的站点提出请求。
如果对Web服务器的请求数量有一些限制,则可以使用Drupal功能来缓存从Web服务器获得的结果:
- cache_get(), ,将数据保存在缓存中
- cache_set(), ,将数据保存在缓存中
要注意,Drupal支持多个缓存箱,并且在必要时模块可以使用自己的缓存箱。
Drupal支持还可以在连续的缓存滑动处自动删除的缓存项(请参阅描述的描述 cache_temporary 持续的)。实施 hook_flush_caches(), ,这些模块允许管理员用户清洁当单击“ performance”页面上的“ clear”按钮或模块调用的任何时间时,都可以清洁模块使用的缓存。 drupal_flush_all_caches().
在Drupal 7中,用于常用数据的缓存数据与处理的静态变量关联 drupal_static(). 。当输出同一页面时确实经常使用数据时,使用类似于以下数据的代码:
// Use the advanced drupal_static() pattern, since this is called very often.
static $drupal_static_fast;
if (!isset($drupal_static_fast)) {
$drupal_static_fast['implementations'] = &drupal_static(__FUNCTION__);
}
$implementations = &$drupal_static_fast['implementations'];
// …
// Fetch implementations from cache.
if (empty($implementations)) {
$implementations = cache_get('module_implements', 'cache_bootstrap');
if ($implementations === FALSE) {
$implementations = array();
}
else {
$implementations = $implementations->data;
}
}
该代码是 module_implements().
其他提示
每次我需要消费Web服务时,我都刚刚创建了一个基于PHP类 file_get_contents 或者 卷曲 和这个结合 JSON_DECODE 或者 Simplexml_load_string.
然后,该类通过使用的Getter函数在模块中访问 drupal_static, , 或者 $static
Drupal 6的模式。
然后,我根据需要在自定义块,菜单回调等内使用此功能。
编辑
@kiamlaluno的答案是正确的,并展示了一种通过Drupal API进行操作的方法。我不这样做的主要原因是,我更喜欢以使我可以在其他应用程序中使用它的方式来抽象网络服务类。这是有优势和缺点,因此请权衡您的选择。