【问题标题】:PHP post request to retrieve JSONPHP 发布请求以检索 JSON
【发布时间】:2010-06-10 20:51:08
【问题描述】:

我正在尝试编写一些简单的 php 代码,该代码将发出一个 post 请求,然后从服务器检索 JSON 结果。 这对我来说似乎很简单,但下面的代码根本没有打开连接。

$port = 2057;
$path = "/validate/";
$request = "value1=somevalue&value2=somevalue&value3=somevalue";

$http_request  = "POST $path HTTP/1.0\r\n";
$http_request .= "Host: $server\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
$http_request .= "Content-Length: " . strlen($request) . "\r\n";
$http_request .= "\r\n";
$http_request .= $request;

$response = '';

if( false == ( $fs = @fsockopen($server, $port) ) ) {
            die ('Could not open socket');
}

fwrite($fs, $http_request);

while ( !feof($fs) )
{
    $response .= fgets($fs, 1160);
}

fclose($fs);

此外,我尝试了一种更简单的方法:

$handle = fopen('http://localhost:2057/validate/?'.$request, "r");

$response = file_get_contents('http://localhost:2057/validate/' . $request);

但这两种方法都会超时。

我正在尝试连接到我在 Visual Studio 中运行的开发服务器,所以我不确定这是否与超时/连接问题有关。

在此处接受任何建议,只要它们是用 PHP 构建的。

【问题讨论】:

  • 你安装了telnet吗?如果不看看here。尝试通过 telnet 连接到您的主机,查看主机是否可访问,如果不能访问,则可能是防火墙问题。
  • 我可以在JS中写一个类似的查询并且到达主机没有问题,所以我认为不是防火墙问题。
  • 可以安全地假设在第一个示例中您没有复制 $server = "localhost"; 的行吗?
  • 您有权访问 Web 服务器日志吗?我经常在安装了类似于 SELinux 的系统上运行 PHP。一般来说,除非明确告知它,否则它甚至不会让您获得文件句柄,更不用说打开 TCP 连接了。您可以在执行此操作时跟踪 httpd 日志吗?

标签: php json post httprequest


【解决方案1】:

有很多纯 PHP HTTP 处理程序可能更适合您。

试试PEAR's HTTP_ClientZend_Http_Client,您可以简单地将它们与您的应用程序捆绑在一起。

如果您下定决心要编写自己的代码,请尝试使用 streams。有一个comprehensive set of HTTP stream options 可供选择。

【讨论】:

    【解决方案2】:

    尝试使用HTTP_Request2;它不在标准 PHP 中,但您可以将它与您的应用程序一起分发,因此您不必担心它是否已安装。

    以下是我用来将文档发布到转换服务器的类的 sn-p;您可以发布您喜欢的任何内容并以类似的方式获得结果。

    $request = new HTTP_Request2('http://whereveryouwant:80/foo/');
    $request->setMethod(HTTP_Request2::METHOD_POST)
        ->setConfig('timeout', CONVERT_SERVER_TIMEOUT)
        ->setHeader('Content-Type', 'multipart/form-data')
        ->addPostParameter('outputFormat', $outputType);
    $request->addUpload('inputDocument', $inputFile);
    $result = $request->send();
    if ($result->getStatus() == 200) {
        return $result->getBody();
    } else {
        return false;
    }
    

    【讨论】:

      【解决方案3】:

      使用 http 扩展名可能更简单:http://fr.php.net/manual/en/function.http-post-data.php

      【讨论】:

      • 我敢打赌,它会是,但是我们会分发这个,我们不能保证人们会有扩展,所以它必须在核心 PHP 中。
      • 您可以使用您的代码分发 Pear 模块;尝试查看 HTTP_Request2,我使用它来提交 POST 请求并轻松检索数据;如果您有兴趣,我会在下面发布一些示例代码。
      猜你喜欢
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2020-12-11
      • 2017-03-14
      相关资源
      最近更新 更多