首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Twitter流API和ReactPHP的坏请求

使用Twitter流API和ReactPHP的坏请求
EN

Stack Overflow用户
提问于 2014-07-13 23:31:47
回答 2查看 346关注 0票数 0

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

要做到这一点,我正在使用ReactPHP。

当我向提出请求时,我得到了BadRequest响应。

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

代码语言:javascript
复制
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“

您可以在这里查看代码:

TwitterConnector.php

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-14 13:14:48

所以答案非常简单,您正在发出HTTP1.0请求,而Twitter需要一个HTTP1.1请求。

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

代码语言:javascript
复制
<?php

use React\HttpClient\RequestData;

class RequestData11 extends RequestData
{
    public function setProtocolVersion($version)
    {
    }
}

和Client11:

代码语言:javascript
复制
<?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;
    }
}

您通常会创建这样的新客户端:

代码语言:javascript
复制
<?php

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

相反,您必须这样创建它:

代码语言:javascript
复制
<?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代码可能因此无法工作。

票数 1
EN

Stack Overflow用户

发布于 2014-07-14 23:26:46

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

Twitter用户一直在回答未经授权的问题。

调试一下后,我发现问题是使用STREAM_CRYPTO_METHOD_TLS_CLIENT占位性方法而不是在

React\SocketClient\StreamEncryption

我找不到一种优雅的修复方法,只需重写StreamEncryption以使用SSL,而SecureConnector则使用重写的StreamEncryption。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24727845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档