如何修复导致站点无法加载的AWS SNS API端点代码?

时间:2018-09-17 作者:AlanP

我正在尝试在Wordpress站点中创建一个API端点,该端点可以接收AWS简单通知服务通知。我现在有这个工作,但在前端,该网站没有加载。以下是代码摘录:

require_once MY_PLUGIN_DIR . \'/libs/aws/aws-autoloader.php\';

use Aws\\Sns\\Message;
use Aws\\Sns\\MessageValidator;

function sns_endpoint() {

   add_rewrite_tag( \'%apitest%\', \'([^&]+)\' );
   add_rewrite_rule( \'test/([^&]+)/?\', \'index.php?apitest=$matches[1]\', \'top\' );

}
add_action( \'init\', \'sns_endpoint\' );

function sns_endpoint_data() {    
    // this line caused the site not to load
    $message = Message::fromRawPostData();
    /* additional code follows... */
}

add_action( \'template_redirect\', \'sns_endpoint_data\' );
没有任何内容写入调试。日志

更新:错误日志中写入了一个错误:SNS消息类型标头没有提供任何解决方法的想法?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

根本原因是:

function sns_endpoint_data() {    
    // this line caused the site not to load
    $message = Message::fromRawPostData();
    /* additional code follows... */
}

add_action( \'template_redirect\', \'sns_endpoint_data\' );
没有if条件检查这是否确实是您希望在其上执行此操作的URL。因此Message::fromRawPostData() 将在使用模板的每个页面上加载,而不考虑URL。

这是因为你从来没有检查过你在哪一页,你试图在错误的钩子里做工作。

处理规则

add_rewrite_tag( \'%apitest%\', \'([^&]+)\' );
add_rewrite_rule( \'test/([^&]+)/?\', \'index.php?apitest=$matches[1]\', \'top\' );
我们看到了apitest 作为重写标记添加,但从未测试过。

因此,让我们修改template_redirect 要执行的操作:重定向模板,说出类似的内容:

function sns_apitest_template_redirect() {    
    global $wp_query;
    if ( !empty( $wp_query->query_vars[\'apitest\'] ) ) {
        $apitest= $wp_query->query_vars[\'apitest\'];
        sns_handle_apitest_endpoint( $apitest );
        exit;
}
add_action( \'template_redirect\', \'sns_apitest_template_redirect\' );
请注意,它试图检测apitest 标记,如果它不为空,则调用一个函数,然后退出。这样,端点逻辑的代码就不会被弄乱template_redirect.

所以现在我们需要这个函数:

function sns_handle_apitest_endpoint( $apitest ) {
    $message = Message::fromRawPostData();
    // etc...
}

结束

相关推荐

使用WordPress Widget API保存复选框值时出现问题

我正在学习WordPress小部件API。除了复选框控件外,其他一切看起来都很好。此外checked() 函数让我有点困惑,如果我必须默认复选框未选中,我不知道应该建议什么值。下面是我正在小部件类包装器中尝试的代码。public function widget( $args, $instance ) { extract( $args ); $checkbox1 = ! empty( $instance[\'checkbox1\'] ) ? $instance[\'checkbox1