PHP post请求检索JSON

问题描述:

我想写一些简单的php代码,将发出一个post请求,然后从服务器检索JSON结果。 对我来说这似乎很简单,但下面的代码根本不打开连接。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构建的,就可以在这里打开任何建议。

+0

您是否安装了telnet?如果不看一下[这里](http://www.leateds.com/2009/telnet-for-windows-vista-windows-7/)。尝试通过telnet连接到您的主机,以查看主机是否可到达,如果不是,则可能是防火墙问题。 – jigfox 2010-06-10 21:01:42

+0

我可以在JS中编写类似的查询,并且无法访问主机,所以我不认为它是防火墙问题。 – Brian 2010-06-10 21:08:26

+0

在第一个例子中,假设你没有复制$ server =“localhost”;? – 2010-06-11 00:33:59

这可能是简单的使用HTTP扩展写:http://fr.php.net/manual/en/function.http-post-data.php

+0

我真的打赌,但是我们会分发这个,我们不能保证人们会有扩展,所以必须在核心PHP。 – Brian 2010-06-10 22:02:52

+2

但是,您可以使用代码分发Pear模块;尝试查看HTTP_Request2,我使用它来提交POST请求并轻松检索数据;如果您有兴趣,我会在下面发布一些示例代码。 – 2010-06-11 02:36:53

有大量纯PHP HTTP处理程序,在那里,可能会更好地为您。

尝试PEAR's HTTP_ClientZend_Http_Client,这两者都可以简单地与您的应用程序绑定。

如果您在编写自己的代码时遇到问题,请尝试使用streams。有一个comprehensive set of HTTP stream options可供选择。

尝试使用HTTP_Request2;它不是标准的PHP,但是你可以将它与你的应用程序一起分发,所以你不必担心它是否被安装。

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

$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; 
}