返回

WordPress wp_remote_post 调用 JSON API 过滤器:解决方案

php

WP_remote_post 调用 JSON API 过滤器应用难题

使用 WordPress 函数 wp_remote_post 连接外部 JSON API 并根据特定条件过滤数据,常常是插件或主题开发中的常见需求。本篇文章旨在讨论如何有效实现这一目标,尤其针对 API 文档中定义的过滤参数。

问题根源

当尝试使用 wp_remote_post 结合 JSON API 的筛选功能时,可能出现几种典型问题:

  1. 请求体格式错误 :API 通常期望请求体是 JSON 格式,而 wp_remote_post 默认采用 application/x-www-form-urlencoded 格式。 使用 json_decode 将 PHP 数组转换为 JSON 可能会引入格式问题, 应该使用 json_encode 而不是 json_decode
  2. 过滤参数传递不正确 : 即使请求体格式正确,API 也可能由于过滤参数的传递方式不正确而忽略筛选条件, 导致返回未过滤的数据。
  3. 缺少 Content-Type 请求头: 一些 API 严格要求声明请求体数据的类型,即 Content-Type 请求头。

解决方案

正确构造 JSON 请求体

要发送符合 JSON API 要求的请求,首先要使用 json_encode() 函数将 PHP 数组转换为 JSON 字符串。 这会确保你的请求体数据格式正确,API能够正确解析请求体。

代码示例:

$url = 'https://api.whise.eu/v1/estates/list';

$body = array(
    'Filter' => array( 'languageId' => 'nl-BE'),
);

$args = array(
    'headers' => array(
        'Authorization' => 'Bearer ' . $token,
         'Content-Type'  => 'application/json'
        ),
    'body'    => json_encode($body),
);

$response = wp_remote_post($url,$args);

操作步骤:

  1. 使用 json_encode() 函数将 $body 转换为 JSON 字符串。
  2. $argsheaders 数组中添加 'Content-Type' => 'application/json'

此方法确保发送的数据以正确的 JSON 格式被 API 处理,解决了因为格式问题导致过滤失效的情况。

仔细检查 API 文档中的参数结构

API 文档是理解 API 请求方式的关键。不同 API 可能会使用不同的参数名称,参数嵌套结构。 请认真阅读 API 文档, 并按照其要求构造 PHP 数组。例如有些API 可能要求 Filter 参数本身是一个字符串形式的JSON,而不是一个嵌套的数组。 另外要注意,是否是PUT/POST之类的,方法和提交的内容应该保持一致。

代码示例:

$url = 'https://api.whise.eu/v1/estates/list';
// 假设API 要求  'Filter' 是一个JSON 字符串

$filter_array = array('languageId' => 'nl-BE');
$filter_json  = json_encode($filter_array);

$body = array(
    'Filter' => $filter_json, //注意此处Filter的值为json字符串
);

$args = array(
    'headers' => array(
        'Authorization' => 'Bearer ' . $token,
        'Content-Type'  => 'application/json'
       ),
    'body'    => json_encode($body),
);

$response = wp_remote_post($url,$args);

操作步骤:

  1. 按照 API 文档中的参数结构要求,定义$filter_array ,并使用 json_encode() 将其转化为 JSON 字符串$filter_json
  2. $filter_json赋值给 body 数组中 Filter 键对应的值。
  3. 确认 'Content-Type' => 'application/json' 正确配置在 headers 里面

这个解决方案强调理解API 规范的重要性,并展示如何灵活适应不同的 API 要求,实现参数结构的适配。

使用 WordPress 提供的参数过滤器(Hooks)

wp_remote_post 函数提供 http_request_args 过滤器钩子,它允许修改 wp_remote_post 的请求参数。使用该过滤器可以更灵活的配置请求, 例如可以在发出请求之前对请求参数进行调试和分析。

代码示例:

add_filter( 'http_request_args', 'custom_modify_request_args', 10, 2 );

function custom_modify_request_args( $args, $url ) {
   if (strpos($url, 'api.whise.eu') !== false) {
        $body = array(
            'Filter' => array( 'languageId' => 'nl-BE'),
        );

       $args['headers']['Content-Type'] = 'application/json';
       $args['body'] = json_encode($body);
    }
    return $args;
}

操作步骤:

  1. 创建一个名为 custom_modify_request_args 的函数,接收 $args (请求参数数组) 和 $url 参数。
  2. 判断 $url 是否包含需要进行配置的API 的地址( api.whise.eu ),防止错误修改其他url。
  3. 构造并使用 json_encode() 设置 args 中的请求体 body 和设置请求头 'Content-Type' => 'application/json'
  4. 返回 $args 参数数组。
  5. 使用 WordPress 提供的 add_filter()custom_modify_request_args 函数添加到 http_request_args 过滤器。

该方法使用过滤器钩子,方便开发者对 HTTP 请求进行更精细的控制。通过修改 wp_remote_post 发送前的请求参数,可动态地配置请求头、请求体等。这种做法允许更精确地操作 API 调用。

安全提示

  • 避免泄露 API 密钥: 不要将 API 密钥或 token 硬编码到代码中,使用 WordPress 安全地管理这些凭证(比如环境变变量或配置文件)。
  • 检查响应: 在处理 API 响应数据之前,务必先检查 wp_remote_post() 是否成功,is_wp_error 是很有用的一个检查方法。
  • 请求频率限制: 尊重API 提供者的频率限制。 如果过于频繁,你的应用可能会被阻止。 可以考虑使用 transient API 来缓存API 的响应。
  • 参数验证: 如果用户控制 API 请求参数,务必对这些参数进行安全验证。

总结

连接 API 是 Web 开发的关键组成部分,通过正确构造 JSON 请求体、认真阅读 API 文档以及使用 WordPress 提供的过滤器钩子,就能有效解决使用 wp_remote_post 进行 API 过滤调用遇到的难题。请始终注意安全性,对可能暴露敏感信息或使应用程序易受攻击的行为进行适当的防护。