2013-07-18 3 views
0

У меня есть простой скрипт PHP, который использует CURL для отправки HTTP-запроса на удаленный сервер.сервер не отвечает на запрос POST с CURL + PHP

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://91.250.77.10/test.php'); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('a' => 'b')); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$contents = curl_exec($ch); 
$error = curl_error($ch); 
curl_close($ch); 
if ($error) 
    echo $error; 
else 
    echo $contents; 

Это приводит к ошибке: «no response from server». Запрос также не может быть найден в журнале доступа на удаленном сервере!

Более того, если я посылаю postfields как строку запроса, т.е .:

curl_setopt($ch, CURLOPT_POSTFIELDS, '&a=b'); 

тогда все просто отлично.

Похоже, что что-то не так с конфигурацией Apache или PHP на удаленном сервере. Любые намеки?

Edit:

На данный момент, похоже, что сервер не принимает (или правильно обрабатывать) запрашивает с Content-Type: многокомпонентные/форма-данные (CURL использует этот тип При настройке array как postfields, но не при настройке строки.)

Поскольку мне нужно отправить файл с запросом, я должен использовать multipart/form-data. Итак, как я могу заставить сервер правильно справиться с этим?

ответ

0

Если вы передадите массив CURLOPT_POSTFIELDS, форма будет отправлена ​​как multipart/form-data Возможно, ваш удаленный конец не принимает этот тип кодировки.

+0

'CURLOPT_POSTFIELDS [...] Этот параметр может быть либо принят в качестве urlencoded строки, как«para1 = val1 & para2 = значение2 & .. . 'или как массив с именем поля в качестве ключа и данных поля как значение ', как вы можете видеть по адресу http://www.php.net/manual/en/function.curl-setopt.php – Eleazan

+0

@Eleazan Спасибо, исправлено – DevZer0

+0

Это не проблема, поскольку я тестировал ее с помощью curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ('Content-Type: multipart/form-data')); –

0

Лучший способ сделать POST запрос - форматировать PostFields следующим образом.

VARIABLE = VALUE раздел: &.

TIP:

$postFields = 'var1=cons1&var2=cons2&var3=cons3&var4=cons4&var5=cons5'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://91.250.77.10/test.php'); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields; 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$contents = curl_exec($ch); 
$error = curl_error($ch); 
curl_close($ch); 
if ($error) 
    echo $error; 
else 
    echo $contents; 

был бы рад, чтобы сделать какой-либо дополнительной помощи.

+0

Как насчет загрузки файла? –

+0

@ThomasLeu ... не должно быть проблемой. 'curl_setopt ($ ch, CURLOPT_POSTFIELDS, Array ('file' => $ filename));' или тот же самый 'var = val', который я описывал выше. Если вы хотите более подробно, я могу добавить ответ. – Black0CodeR

+0

Вы имеете в виду, что я могу отправить файл с помощью Content-Type 'application/x-www-form-urlencoded'? Если да, скажите, пожалуйста. –

0

Проверьте, содержит ли HTTP-заголовок поле «Ожидание: 100-продолжить». Некоторые серверы не занимаются этим полем и просто ждут. Вы можете попробовать:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect: ')); 

Для получения дополнительной информации, пожалуйста смотрите: curl http 100 continue and multipartform-data post

+0

Это тоже не сработало :-( –

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