2010-08-19 68 views
0

我想写一个PHP脚本发送一个http发布请求到一个URL。它似乎没有通过服务器没有收到它。谁能帮忙?PHP插座http后不工作

<?php 
function postXMLToURL ($server, $path, $xmlDocument) { 
    $xmlSource = $xmlDocument; 
    $contentLength = strlen($xmlSource); 
    //$fp = fsockopen($server, 80); 
    $fp = fsockopen($server,8080); 
    fwrite($fp, "POST $path HTTP/1.0\r\n"); 
    fwrite($fp, "Host: $server\r\n"); 
    fwrite($fp, "Content-Type: application/xml\r\n"); 
    fwrite($fp, "Content-Length: $contentLength\r\n"); 
    fwrite($fp, "Connection: close\r\n"); 
    fwrite($fp, "\r\n"); // all headers sent 
    fwrite($fp, $xmlSource); 
    $result = ''; 
    while (!feof($fp)) { 
     $result .= fgets($fp, 128); 
    }  
    return $result; 
} 

function getBody ($httpResponse) { 
    $lines = preg_split('/(\r\n|\r|\n)/', $httpResponse); 
    $responseBody = ''; 
    $lineCount = count($lines); 
    for ($i = 0; $i < $lineCount; $i++) { 
     if ($lines[$i] == '') { 
      break; 
     } 
    } 
    for ($j = $i + 1; $j < $lineCount; $j++) { 
     $responseBody .= $lines[$j] . "\n"; 
    } 
    return $responseBody; 
} 

$xmlDocument = new DomDocument($final_xml); //final_xml is my xml in a string 

$result = postXMLtoURL("localhost", "/resources", $xmlDocument); 
$responseBody = getBody($result); 

$resultDocument = new DOMDocument(); 
$resultDocument->loadXML($responseBody); 

header('Content-Type: application/xml'); 
echo $resultDocument->saveXML(); 
} 
?> 
+3

是否有你使用套接字而不是cURL的原因? http://php.net/manual/en/book.curl.php – 2010-08-19 20:16:40

+0

尝试通过一个'fwrite'调用发送所有头文件... – ircmaxell 2010-08-19 20:17:53

+0

我使用的服务器没有安装cURL。这和使用套接字有很大的区别吗? 我试着在一次fwrite调用中发送所有头文件,没有任何改变。 – John 2010-08-19 20:22:59

回答

0

你需要学习如何帮助自己。

代码中没有错误检测 - 您至少应该在调用fsockopen之后检查fp是否有效,首选应该有更多的错误检查。

另外,弄个wireshark之​​类的东西,看看你的代码生成了什么包。

C.

0

你可以使用stream_context_create(); 一旦我写了一个PHP类,你就可以使用它。

<?php 

class HTTPRequest 
{ 
    protected $url; 

    protected $method;  

    protected $headers; 

    protected $data = ""; 

    protected $useragent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; 


    public function __construct(){} 


    public function setHeaders($headers) 
    { 
     if(is_array($headers)) 
     { 
      $this->headers = $headers; 
      return true;    
     } 
     return false; 

    } 

    public function get($request) 
    { 
     if(!$this->headers) 
     { 
      throw new Exception("Please set Headers"); 
     } 
     $this->url   = $request; 
     $this->method  = "GET"; 
     return $this->send(); 
    } 

    public function put($request,$xml) 
    { 
     if(!$this->header) 
     { 
      throw new Exception("Please set Headers"); 
     } 

     $this->url   = $request; 
     $this->method  = "PUT"; 
     $this->data  = $xml; 

     return $this->send(); 

    } 


    public function post($request,$xml) 
    { 
     if(!$this->headers) 
     { 
      throw new Exception("Please set Headers"); 
     } 

     $this->url   = $request; 
     $this->method  = "POST"; 
     $this->data  = $xml; 

     return $this->send(); 
    } 


    public function delete($request) 
    { 
     if(!$this->headers) 
     { 
      throw new Exception("Please set Headers"); 
     } 

     $this->url   = $request; 
     $this->method  = "DELETE"; 
     return $this->send(); 

    } 



    public function setUserAgent($useragent) 
    { 
     $this->useragent = $useragent; 
    } 

    protected function send() 
    { 

     $params = array('http' => array 
             (
             'method'  => $this->method, 
             'content' => $this->data, 
             'user_agent' => $this->useragent 
             ) 
         ); 
     $headers = ""; 

     if (!empty($this->headers) && is_array($this->headers)) 
     { 
      foreach ($this->headers as $header) 
      { 
       $headers .= $header."\n"; 
      } 
     } 

     $params['http']['header'] = $headers; 

     $context = stream_context_create($params); 

     $fp   = fopen($this->url, 'r', false, $context); 

     if (!$fp) 
     { 
      throw new Exception("Problem with ".$this->url); 
     } 

     $response = stream_get_contents($fp); 

     if ($response === false) 
     { 
      throw new Exception("Problem reading data from ".$this->url); 
     } 

     return $response; 
    } 
} 
?>