2010-08-19 6 views
0

Je suis en train d'écrire un script php pour envoyer une requête http post à une URL. Il ne semble pas passer pour le serveur ne le reçoit pas. Quelqu'un peut-il aider?php socket http post ne fonctionne pas

<?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

Y a-t-il une raison pour laquelle vous utilisez des sockets et non cURL? http://php.net/manual/fr/book.curl.php –

+0

Essayez d'envoyer tous les en-têtes via un appel 'fwrite' ... – ircmaxell

+0

Le serveur que j'utilise n'a pas installé cURL. Y a-t-il une grande différence entre cela et l'utilisation de sockets? J'ai essayé d'envoyer tous les en-têtes dans un appel fwrite, pas de changement. – John

Répondre

0

Vous devez apprendre comment vous aider.

Il n'y a aucune détection d'erreur dans le code - vous devriez au moins vérifier que fp est valide après l'appel de fsockopen, de préférence il devrait y avoir beaucoup plus de vérification d'erreur.

De même, obtenez quelque chose comme wireshark et voyez quels paquets génèrent votre code.

C.

0

Vous pouvez également utiliser stream_context_create(); Une fois que j'ai écrit une classe PHP, vous êtes prêt à l'utiliser.

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