【问题标题】:Bad request with Twitter Streaming API and ReactPHPTwitter Streaming API 和 ReactPHP 的错误请求
【发布时间】:2014-07-13 23:31:47
【问题描述】:

我正在做一个需要来自 twitter 流 api 的实时数据的项目。

为此,我正在使用 ReactPHP。

当我向 twitter streamintg API 发出请求时,我收到了 BadRequest 响应。

请求(带有有效负载)如下:

POST /1.1/statuses/filter.json HTTP/1.0
Host: stream.twitter.com
User-Agent: React/alpha
Authorization: OAuth oauth_nonce="0f1add32ee06141004ea4c02d892bdaf",oauth_timestamp="1405130866",oauth_consumer_key="72XsNwUvJjw0xaSinIk1mzHL0",oauth_token="366141931-Zxljl6Ycwgdh9a5IYPqImJT5zeat2EJOAJOarTq6",oauth_signature_method="HMAC-SHA1",oauth_signature="Rs57ywc26IRNQA1l9zQZwoRMV5Q%3D"
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

track=arg

为此我正在使用:

"jacobkiers/oauth": "1.0." => 用于 oauth "react/http-client": "" => 连接流式 API

你可以在这里查看代码:

TwitterConnector.php

谢谢

【问题讨论】:

    标签: php api twitter oauth twitter-streaming-api


    【解决方案1】:

    所以答案很简单,您正在发出 HTTP 1.0 请求,而 Twitter API 需要 HTTP 1.1 请求。

    问题的根源在于Request object。为了解决这个问题,我很快又创建了两个类。请求数据11:

    <?php
    
    use React\HttpClient\RequestData;
    
    class RequestData11 extends RequestData
    {
        public function setProtocolVersion($version)
        {
        }
    }
    

    和 Client11:

    <?php
    
    use React\EventLoop\LoopInterface;
    use React\HttpClient\Request;
    use React\SocketClient\ConnectorInterface;
    
    class Client11
    {
        private $connectionManager;
        private $secureConnectionManager;
    
        public function __construct(ConnectorInterface $connector, ConnectorInterface     $secureConnector)
        {
            $this->connector = $connector;
            $this->secureConnector = $secureConnector;
        }
    
        public function request($method, $url, array $headers = array())
        {
            $requestData = new RequestData11($method, $url, $headers);
            $connectionManager = $this->getConnectorForScheme($requestData->getScheme());
            return new Request($connectionManager, $requestData);
    
        }
    
        private function getConnectorForScheme($scheme)
        {
            return ('https' === $scheme) ? $this->secureConnector : $this->connector;
        }
    }
    

    您通常会像这样创建一个新客户端:

    <?php
    
    $client = $httpClientFactory->create($loop, $dnsResolver);
    

    相反,您必须以这种方式创建它:

    <?php
    
    $connector = new Connector($loop, $dnsResolver);
    $secureConnector = new SecureConnector($connector, $loop);
    $client = new Client11($connector, $secureConnector);
    

    这会强制客户端使用 HTTP 1.1,但请注意,http-client 是 1.0 客户端,因此只有在您知道自己在做什么时才应该将其强制为 1.1。

    请注意,您没有在 composer 文件中锁定 react\http-client 版本,因此我不知道您使用的是什么版本,因此上述代码可能无法正常工作。

    【讨论】:

    • 关于http-client版本,应该是0.4(我认为)。我与 Ratchet 存在兼容性问题,所以我让作曲家解决它(之后我忘了更改它)。我稍后会尝试。谢谢
    【解决方案2】:

    之前的评论修复了 HTTP 版本的问题。 但我有另一个问题。

    Twitter 一直在回复 Unauthorize。

    稍微调试一下,我发现问题是 Reacts 使用 STREAM_CRYPTO_METHOD_TLS_CLIENT 加密方法而不是 STREAM_CRYPTO_METHOD_SSLv23_CLIENT

    React\SocketClient\StreamEncryption

    我找不到优雅的修复方法,只需重写 StreamEncryption 以使用 SSL 和 SecureConnector 以使用重写的 StreamEncryption

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2016-06-30
      • 2013-08-19
      相关资源
      最近更新 更多