2015-10-20 2 views
1

У меня есть простая форма, которую я хочу преобразовать в бэкэнд-систему PHP.CURL не публикует данные по адресу

В настоящее время эта форма содержит действие, отправляемое на URL-адрес: URL-адрес принимает приглашение только тогда, когда отправляются данные с именем postdata и исправлена ​​информация (xml, которая была закодирована).

Работы: - Обратите внимание, что имя входа называется postdata и значение содержит xml, который был urlencoded и она прекрасно работает.

<form name="nonjava" method="post" action="https://url.com"> 
    <input name="postdata" id="nonjavapostdata" type="hidden" value="&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;" /> 
    <button type="submit" name="submit">Button</button> 
</form> 

Однако я хочу, чтобы достичь следующего пути перемещения postdata элемента в PHP, как много информации проходят через этот путь.

Обратите внимание: ссылка https, но она не работала на локальном компьютере, поэтому мне пришлось отключить ее в CURL.

<?php 
    $url = 'https://super.com'; 
    $xmlData = '<?xml version="1.0" encoding="utf-8"?> 
    <postdata 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <api>2</api> 
    </postdata>'; 

    $testing = urlencode($xmlData); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, "postdata=" . $testing); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_VERBOSE, true); 

    $response = curl_exec($ch); 

    // Then, after your curl_exec call: 
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
    $header = substr($response, 0, $header_size); 
    $body = substr($response, $header_size); 

    echo $header_size . '<br>'; 
    echo htmlspecialchars($header) . '<br>'; 
    echo htmlspecialchars($body) . '<br><br>'; 

    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    echo "$http_status for $url <br>"; 
?> 

я получаю ошибку 302 (который является содержание URL не находит данные, чтобы его перенаправление на странице не найден.)

+0

Я думаю, что вы ищете флаговый флаг CURLOPT_FOLLOWLOCATION – Smokie

ответ

0

302 НЕ ошибка; это просто означает, что вам нужно перейти на перенаправленный URL. Браузер делает это автоматически для вас. В PHP-коде вам придется делать это самостоятельно. Посмотрите на заголовок местоположения на 302.

Я попытался посмотреть, есть ли способ, с помощью которого Curl можно было бы следовать через перенаправления; многие языковые HTTP-библиотеки поддерживают это. Эта нить, кажется, предполагает, что Curl также поддерживает его - Is there a way to follow redirects with command line cURL

+0

curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, true); – Smokie

0

Ваш код работает, как предполагается, я получаю данные POST:

Array ([postdata] => <?xml version="1.0" encoding="utf-8"?> <postdata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/20 01/XMLSchema"> <api>2</api> </postdata>)

в результате. Проблема находится на принимающей стороне, она не обрабатывает ее правильно.

+0

В значительной степени - данные почтового отправления, то есть данные xml должны быть htmlencoded и отправляться на URL. Как уже говорилось, HTML-версия кода отлично работает без каких-либо php. –

+0

Не уверен, чего вы пытаетесь достичь? Возможно, вы хотите называть htmlentites на нем: '$ testing = urlencode (htmlentities ($ xmlData));'? –

0

Вам необходимо следить за перенаправлением 302 в curl. Это относительно легко сделать, добавив флаг местоположения. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); Это эквивалент делать curl -L в CLI. В документации php вы можете увидеть пример here.

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