2010-03-19 4 views
2

У меня есть следующий код, который работает на PHP5 для отправки HTTP POST без использования cURL. Я бы хотел, чтобы это работало на PHP 4.3.0 и выше:PHP4 HTTP сообщение без 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); 

HTTP-контекст поддерживается только на PHP5. В любом случае, чтобы выполнить эту работу с PHP 4.3.0, мне нужен резервный метод, если PHP5 или cURL не установлены.

+0

Что именно не работает? Вы получаете какую-то конкретную ошибку? – gpmcadam

+0

file_get_contents не разрешает контекст на PHP 4 Я получаю сообщение об ошибке, что file_get_contents принимает только 2 параметра. – Luke

+0

Кодирование решения, которое будет надежно работать в PHP4, - это больше усилий, чем это стоит - попросите своих клиентов обновиться. OTOH, предполагая, что вы безумно безумны, вы можете посмотреть http://sourceforge.net/projects/snoopy/ – symcbean

ответ

0

Вы не должны использовать PHP 4. Это прекращено и поэтому не получает никаких исправлений безопасности.

Если вы хотите взглянуть на что-то само собой, вы хотите начать с fsockopen(). Существует базовый пример, который может делать то, что вы хотите, и не должно быть слишком сложно преобразовать его в запрос POST. Я использовал пакетный сниффер (Wireshark), чтобы получить образцы HTTP, которые я мог (по сути) копировать и вставлять в мое приложение PHP, однако спецификации и множество образцов доступны в Интернете.

+1

Осторожно: используйте соответствующие строки для системы, в которой вы откроете сокет или потратите дни, задаваясь вопросом, что ваш код не работает. Я говорю по опыту? Мне жаль, что я не был. –

+0

Спасибо, это очень полезно. – Luke

+1

К сожалению, у нас нет контроля над системами, на которых запущен PHP 4.3.0. Однако у меня есть контроль над системой, которую я вызываю POST, поэтому окончание строк не изменится. – Luke

0

Что-то вроде следующего будет делать трюк, если кому-то понадобится помощь в этом.

 $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

Для чего первый заголовок Content-type здесь? –

Смежные вопросы