2010-03-19 9 views
2

J'ai le code suivant qui fonctionne sur PHP5 pour envoyer un HTTP POST sans utiliser cURL. Je voudrais que cela fonctionne sur PHP 4.3.0 et au-dessus:PHP4 HTTP Post sans cURL

$opts = array('http' => 
    array(
     'method' => 'POST', 
     'header' => "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Type: application/json\r\n", 
     'content' => $query 
    ) 
); 
$context = stream_context_create($opts); 
$result = file_get_contents($url, false, $context); 

Le contexte HTTP est seulement supporté sur PHP5. Y a-t-il un moyen de faire fonctionner PHP 4.3.0? J'ai besoin d'une méthode de secours si PHP5 ou cURL n'est pas installé.

+0

Qu'est-ce qui ne fonctionne pas exactement? Avez-vous une erreur spécifique? – gpmcadam

+0

file_get_contents ne permet pas le contexte sur PHP 4 Je reçois une erreur que file_get_contents n'accepte que 2 paramètres. – Luke

+0

Le codage d'une solution qui fonctionnera de manière fiable dans PHP4 demande plus d'efforts que de valeur - faites mettre à jour vos clients. OTOH, en supposant que vous êtes fou furieux, vous pouvez regarder http://sourceforge.net/projects/snoopy/ – symcbean

Répondre

0

Vous ne devriez pas utiliser PHP 4. Il est discontinué et ne reçoit donc aucun correctif de sécurité.

Si vous voulez jeter un coup d'œil vous-même, vous voulez commencer par fsockopen(). Il y a un exemple de base qui peut faire ce que vous voulez et il ne devrait pas être trop difficile de le convertir en une requête POST. J'ai utilisé un sniffer de paquets (Wireshark) pour obtenir des échantillons HTTP que je pouvais (en substance) copier et coller dans mon application PHP, mais les spécifications et beaucoup d'échantillons sont disponibles en ligne.

+1

Avertissement: utilisez les fins de ligne appropriées au système sur lequel vous allez ouvrir une socket ou passez des jours à vous demander si votre code ne fonctionne pas. Est-ce que je parle d'expérience? J'aimerais ne pas. –

+0

Merci, c'est très utile. – Luke

+1

Malheureusement, nous n'avons aucun contrôle sur les systèmes qui exécutent PHP 4.3.0. Cependant, j'ai le contrôle du système que j'appelle le POST, donc les fins de ligne ne changeront pas. – Luke

0

Quelque chose comme ce qui suit fera l'affaire si quelqu'un a besoin d'aide pour cela.

 $headers = "POST $url 1.1\r\n"; 
     $headers .= "Content-type: application/x-www-form-urlencoded\r\n"; 
     $headers .= "Content-Type: application/json\r\n"; 
     $headers .= "Accept: application/json\r\n"; 
     if (!empty($body)) { 
      $headers .= "Content-length: " . strlen($body) . "\r\n"; 
     } 
     $headers .= "\r\n"; 

     $body = $query; 

     if ($fp = fsockopen($host, 80, $errno, $errstr, 180)) { 
      fwrite($fp, $headers . $body, strlen($headers . $body)); 
      fclose(); 
     } 
+0

Pour quel premier en-tête 'Content-type' ici? –