如何为HTML5的事件源提供rest API定制端点?

时间:2018-10-13 作者:acidrums4

因此,在构建带有Telegram的自定义虚拟web聊天服务的过程中,我试图获取Telegram发送到服务器的消息,并将其重定向到前端。SSE与HTML5 EventSource 似乎是实现这一目标的最佳且简单的解决方案。

问题是EventSource需要\'Content-Type: text/event-stream\'\'Cache-Control: no-cache\' 服务器响应中设置的标头。

如果aWP_REST_REQUEST 在设置响应的函数上返回(“set\\u telegram\\u response”,下文),EventSource将不会收到任何内容。但是,如果响应得到响应,EventSource将关闭连接,声称服务器正在发送JSON响应,而不是text/event-stream

以下是我为这篇文章所写的课程的基本内容。如果在该端点上拉取GET请求,它将返回“Some text”字符串。但是EventSource脚本什么也不打印,就好像响应是空的一样。

class Chat
{
    private static $token, $telegram, $chat_id;
    public $telegram_message;

    public function __construct()
    {
        self::$chat_id = "<TELEGRAM-CHAT-ID>";
        self::$token = "<TELEGRAM-TOKEN>";
        self::$telegram = "https://api.telegram.org:443/bot" . self::$token;

        add_action(\'rest_api_init\', array( $this, \'set_telegram_message_endpoint\' ));
        add_action(\'admin_post_chat_form\', array( $this, \'chat_telegram\' ));
        add_action(\'admin_post_nopriv_chat_form\', array( $this, \'chat_telegram\' ));
    }

    public function set_telegram_message_endpoint()
    {
        register_rest_route(\'mybot/v2\', \'bot\', array(
            array(
                \'methods\' => WP_REST_SERVER::CREATABLE,
                \'callback\' => array( $this, \'get_telegram_message\' ),
            ),
            array(
                \'methods\' => WP_REST_SERVER::READABLE,
                \'callback\' => array( $this, \'set_telegram_message\' ),
            ),
        ));
    }

    public function set_telegram_message( WP_REST_REQUEST $request )
    {
        $new_response = new WP_REST_Response( "Some text" . PHP_EOL . PHP_EOL, 200 );
        $new_response->header( \'Content-Type\', \'text/event-stream\' );
        $new_response->header( \'Cache-Control\', \'no-cache\' );
        ob_flush();
        return $new_response;
    }

    public function get_telegram_message( WP_REST_REQUEST $request )
    {
        $this->telegram_message = $request;
        //return rest_ensure_response( $request[\'message\'][\'text\'] );
    }

    public function chat_telegram( $input = null )
    {
        $mensaje = $input === \'\' ? $_POST[\'texto\'] : $input;
        echo $mensaje;

        $query = http_build_query([
            \'chat_id\' => self::$chat_id,
            \'text\' => $mensaje,
            \'parse_mode\' => "Markdown",
        ]);

        $response = file_get_contents( self::$telegram . \'/sendMessage?\' . $query );
        return $response;
    }
}
我花了整个下午和今天上午的一部分时间阅读REST API上的文档,但找不到任何关于可能出现的错误或如何做到这一点的线索。

顺便说一句,我正在部署的服务器可以处理EventSource请求——我刚刚在测试PHP脚本上试用过,效果很好。所以我真的不知道这里发生了什么。任何帮助都将不胜感激。

2 个回复
SO网友:Johansson

这是因为rest API内部使用json_encode() 输出数据。有两种方法可以解决此问题。

1。阻止API发送数据这可能有点奇怪并引发一些问题,但您可以设置标题类型并在返回数据之前回显内容:

header( \'Content-Type: text/event-stream\' );
header( \'Cache-Control: no-cache\' );

// Echo whatever data you got here

// Prevent the API from continuing
exit();
由于这不是使用API的标准方式,因此可能会导致一些问题。我自己也没试过。

2。使用admin-ajax.php

使用管理AJAX代替RESTAPI。实现是相同的。基本上如果你使用json_encode() 与…一起die(); 您将获得与rest API相同的结果。这个codex page 这个话题几乎涵盖了一切。通过使用管理AJAX,您可以完全控制标题和输出类型。

SO网友:djboris

我无法对此进行测试,但您能否尝试使用此挂钩更改响应标题:

add_action( \'rest_api_init\', function() {

    remove_filter( \'rest_pre_serve_request\', \'rest_send_cors_headers\' );

    add_filter( \'rest_pre_serve_request\', function( $value ) {

        header( \'Content-Type\', \'text/event-stream\' );
        header( \'Cache-Control\', \'no-cache\' );

        return $value;

    });
}, 15 );
我是从here.

结束

相关推荐

Php致命错误:无法将WP_REST_RESPONSE类型的对象用作wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php中

我向WordPress添加了一个自定义端点,如下所示: add_action( \'rest_api_init\', function () { register_rest_route( \'menc/v1\', \'/crosscat/(?P[\\w-]+)/(?P[\\w-]+)\', array( \'methods\' => \'GET\', \'callback\' => \'dept_cat_api\',&#x