捕获天气API远程数据
的msg
,你在你的问题出基本上是从天气API的结果。它说,没有数据可用于您的位置。
您要做的第一件事是对Codex和“ WP HTTP API”进行一些研究。
正确/ WP方式来获取远程数据
在了解了WP HTTP API之后,您将看到执行此操作的常用方法是(简化如下):
$response = wp_remote_request( 'http://example.com?some=parameter', array(
'ssl_verify' => true
) );
如果有错误(如您的示例所示),则可以使用WP_Error
该类来捕获它:
is_wp_error( $response ) AND printf(
'There was an ERROR in your request.<br />Code: %s<br />Message: %s',
$response->get_error_code(),
$response->get_error_message()
);
然后是时候获取适当的数据了。如果远端的所有问题都解决了,它将显示200
和OK
。重要信息:远程数据将遵循其内部标准。因此可能会有错误,但是您仍然会200/OK
从错误中得到肯定的信息。
$response_code = wp_remote_retrieve_response_code( $response );
$response_status = wp_remote_retrieve_response_message( $response );
得到结果
最后是时候检查结果了。首先,我们摆脱了前导/后缀空白。在以下示例中,您将看到如何使用WP HTTP API检查标头。如果捕获了JSON
,则继续使用json_decode()
,如果得到XML
,则使用PHP的本机SimpleXML
类。
// Prepare the data:
$content = trim( wp_remote_retrieve_body( $response ) );
// Convert output to JSON
if ( strstr( wp_remote_retrieve_header( $response, 'content-type' ), 'json' ) )
{
$content = json_decode( $content );
}
// … else, after a double check, we simply go with XML string
elseif ( strstr(
wp_remote_retrieve_header( $response, 'content-type' ),
'application/xhtml+xml'
) )
{
// Lets make sure it is really an XML file
// We also get cases where it's "<?XML" and "<?xml"
if ( '<?xml' !== strtolower( substr( $content, 0, 5 ) ) )
return false;
// Also return stuff wrapped up in <![CDATA[Foo]]>
$content = simplexml_load_string( $content, null, LIBXML_NOCDATA );
}
// If both didn't work out, then we maybe got a CSV, or something else...
如果是CSV文件,则必须在互连网上找到自定义解决方案或搜索PHP类。但老实说:如果他们使用的是CSV,则搜索其他服务会更容易。
用瞬态缓存数据
该瞬态API提供一个很不错的方式做到这一点:
// Set Transient
$transient = set_transient(
'Your cache key',
$content,
60*60*6
);
然后,您应该可以使用捕捉瞬态get_transient()
。
常见错误
一个经常遇到的错误是SSL验证不起作用。很高兴您可以轻松开启/关闭它:
// ON:
add_filter( 'https_ssl_verify', '__return_true' );
// OFF:
add_filter( 'https_ssl_verify', '__return_false' );
有一件很有趣的事情,在检查适当的核心文件时您会发现:核心还为本地请求提供了一个过滤器。但是不要被这个迷住了。仅当您A)从WP安装中提供远程服务并且B)自己使用该服务时,才使用此过滤器!我知道,这可能是#WTF?!
一会儿,这并不是您可以在本地安装和生产环境/服务器之间使用不同的SSL验证设置的切换,但是它背后还有一个想法:测试您所使用的服务提供我自己,就像我在此处向WP G +社区解释的那样。
// Debug your own service without SSL verification.
add_filter( 'https_local_ssl_verify', '__return_false' );
调试请求及其结果
无需深入了解更新过程,但是WP HTTP API使用WP_HTTP类。它还提供了一个好东西:调试钩子。
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
在哪里$response
还可以是一个WP_Error
可以告诉您更多信息的对象。
注意:从简短的测试来看,如果将过滤器放置在离实际执行请求的位置较近的位置,则该过滤器似乎仅(出于某种原因)起作用。因此,也许您需要在以下过滤器之一的回调中调用它。
是没有卷曲?
简单。上面显示的“ WP HTTP API”的所有功能基本上都是WP_HTTP
类内部的基于函数的包装器,该包装器充当基类(并将在不同的情况下进行扩展)。延伸WP_HTTP_*
类Fsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
。如果将回调链接到'http_api_debug'
-action,则第三个参数将告诉您哪个类用于您的请求。您不必直接调用类。只需使用功能。
对于大多数远程/ HTTP API请求,它是WP_HTTP_curl
类,它是PHP本机curl
库的包装。
在WP_HTTP_curl
类内部,您将找到request()
方法。此方法提供了两个过滤器来拦截SSL行为:一个用于本地请求'https_local_ssl_verify'
,一个用于远程请求'https_ssl_verify'
。WP可能会定义local
为localhost
,你会得到什么return
的get_option( 'siteurl' );
。
get_transient()
- 无关,但与API请求有关:如错误消息所给。除了建议您使用外,您wp_remote_post
只需要确保发送的请求是有效的即可。