我正在做一个项目,需要从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