【问题标题】:THttpClient failed to open stream: HTTP request failed! HTTP/1.1 400 Bad RequestTHttpClient 无法打开流:HTTP 请求失败! HTTP/1.1 400 错误请求
【发布时间】:2017-06-27 08:41:53
【问题描述】:

这是我用 Python 编写的代码,用于连接到运行良好的服务器。

transport = THttpClient.THttpClient(secureUrl)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = EdenRemote.Client(protocol)
transport.open()

print "calling openSession..."
client.openSession(sessionID, 1)

当我尝试像这样在 PHP 中编写上述代码时

$socket = new THttpClient($liveURL, 80, '', 'https');
$socket->setTimeoutSecs(50);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = new TBinaryProtocol($transport);
$client = new \edenremotephp\pub\EdenRemote\EdenRemoteClient($protocol);
$transport->open();
$client->openSession($result->sessionID, 1);

然后我得到以下错误

Array ( [type] => 2 [message] => fopen(https://edenremote.paceap.com/EdenRemote/d11fbf20-ca24-45f0-b176-4a22e28907c5): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request [file] => /home/abbas/www/local.edenremote.com/sdk/Thrift/Transport/THttpClient.php [line] => 207 )

第207行代码是

public function flush() {
    // God, PHP really has some esoteric ways of doing simple things.
    $host = $this->host_.($this->port_ != 80 ? ':'.$this->port_ : '');

    $headers = array();
    $defaultHeaders = array('Host' => $host,
                            'Accept' => 'application/x-thrift',
                            'User-Agent' => 'PHP/THttpClient',
                            'Content-Type' => 'application/x-thrift',
                            'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_));
    foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) {
        $headers[] = "$key: $value";
    }

    $options = array('method' => 'POST',
                     'header' => implode("\r\n", $headers),
                     'max_redirects' => 1,
                     'content' => $this->buf_);
    if ($this->timeout_ > 0) {
      $options['timeout'] = $this->timeout_;
    }
    $this->buf_ = '';

    $contextid = stream_context_create(array('http' => $options));
    $this->handle_ = @fopen($this->scheme_.'://'.$host.$this->uri_, 'r', false, $contextid);

    // Connect failed?
    if ($this->handle_ === FALSE) {
      $this->handle_ = null;
      $error = 'THttpClient: Could not connect to '.$host.$this->uri_;
      throw new TTransportException($error, TTransportException::NOT_OPEN);
    }
  }

即使我尝试使用 ssl 更改 https。对于运输,即使我尝试过

$transport = new TFramedTransport($socket, 1024, 1024);

【问题讨论】:

    标签: php python thrift


    【解决方案1】:

    这是 THttpClient 调用的问题。第一个参数应该是主机,uri 应该在第三个参数中。

    所以准确的称呼是

    $result = json_decode(exec('./Authenticator.py'));
    $liveURL = $result->secureUrl;
    $liveURI = preg_replace('#^https?://edenremote.paceap.com#', '', rtrim($result->secureUrl,'/'));
    $socket = new THttpClient('edenremote.paceap.com', 80, $liveURI, 'https');
    $socket->setTimeoutSecs(50);
    $transport = new TBufferedTransport($socket, 1024, 1024);
    $protocol = new TBinaryProtocol($transport);
    $client = new \edenremotephp\pub\EdenRemote\EdenRemoteClient($protocol);
    $transport->open();
    $client->openSession($result->sessionID, 1);
    $isExist = $client->findUserByEmailAddress($result->sessionID, $account->primaryEmail);
    var_dump($isExist);
    $client->closeSession($result->sessionID);
    echo 'Done';
    

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 1970-01-01
      • 2020-12-18
      • 2017-08-07
      • 2012-12-31
      • 2015-04-10
      相关资源
      最近更新 更多