我正在做一个需要来自twitter流api的实时数据的项目。
要做到这一点,我正在使用ReactPHP。
当我向提出请求时,我得到了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”API /http-client“:”=>连接到流API“
您可以在这里查看代码:
谢谢
发布于 2014-07-14 13:14:48
所以答案非常简单,您正在发出HTTP1.0请求,而Twitter需要一个HTTP1.1请求。
问题的根源在于请求对象。为了解决这个问题,我很快又创建了两个类。RequestData11:
<?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);这迫使客户端使用HTTP1.1,但请注意,是一个1.0客户端,所以只有当您知道自己在做什么时,才应该强制使用HTTP1.1。
请注意,您没有在composer文件中锁定react\http-client版本,因此我不知道您使用的是哪个版本,bove代码可能因此无法工作。
发布于 2014-07-14 23:26:46
前面的注释修复了HTTP版本的问题。但我有另一个问题。
Twitter用户一直在回答未经授权的问题。
调试一下后,我发现问题是使用STREAM_CRYPTO_METHOD_TLS_CLIENT占位性方法而不是在
React\SocketClient\StreamEncryption
我找不到一种优雅的修复方法,只需重写StreamEncryption以使用SSL,而SecureConnector则使用重写的StreamEncryption。
https://stackoverflow.com/questions/24727845
复制相似问题