使用Twitter流API和ReactPHP的错误请求



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

我使用的是ReactPHP。

当我向twitter流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。" => for oauth"react/http-client": "" =>连接流API

你可以在这里检查代码:

TwitterConnector.php

谢谢

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

问题的根源在Request对象中。为了解决这个问题,我很快又创建了两个类。RequestData11:

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

和Client11:

<?php
use ReactEventLoopLoopInterface;
use ReactHttpClientRequest;
use ReactSocketClientConnectorInterface;
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。

请注意,您没有锁定reacthttp-client版本在您的编写器文件,所以我不知道你使用的是什么版本,上面的代码可能无法工作,因为

前面的注释修复了HTTP版本的问题。但我有另一个问题。

twitter一直在回答未授权。

稍微调试一下,我发现问题是在

中react使用STREAM_CRYPTO_METHOD_TLS_CLIENT加密方法而不是STREAM_CRYPTO_METHOD_SSLv23_CLIENT

反应 SocketClient StreamEncryption

我找不到一个优雅的方法来修复,只是重写StreamEncryption使用SSL和SecureConnector使用重写的StreamEncryption

相关内容

  • 没有找到相关文章

最新更新