2009-12-22 3 views
0

Вот дамп от WireShark:cURL, WireShark. Настройка заголовков для отправки данных и получить XML

POST /drm/drm_production_v2.php HTTP/1.1 

content-length: 278 

content-type: text/xml 

User-Agent: UserAgent 1.0 

Connection: Keep-Alive 

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= 

host: www.example.com 



<methodCall> 
    <methodName>aMethod</methodName> 
    <params> 
    <param> 
     <value> 
     <base64>dXNlcm5hbWU6cGFzc3dvcmQ=</base64> 
     </value> 
    </param> 
    <param> 
     <value> 
     <struct/> 
     </value> 
    </param> 
    </params> 
</methodCall> 

У меня есть XML-файл, сохраненный в отдельный файл. Вот что я делаю:

<?php 

function httpsPost($Url, $xml_data, $headers) 
{ 
    // Initialisation 
    $ch=curl_init(); 
    // Set parameters 
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_URL, $Url); 
    // Return a variable instead of posting it directly 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_USERPWD,"username:password"); 

    // Activate the POST method 
    curl_setopt($ch, CURLOPT_POST, 1) ; 
    curl_setopt($ch,CURLOPT_USERAGENT,"UserAgent 1.0"); 
    // Request 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 999); 

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    // execute the connexion 
    $result = curl_exec($ch); 
    // Close it 
    curl_close($ch); 
    return $result; 
} 
$str='username:password'; 
$auth=base64_encode($str); 
$request_file = "./request.xml"; 
$fh = fopen($request_file, 'r'); 
$filesize=filesize($request_file); 
echo $filesize; 
$xml_data = fread($fh,$filesize); 

fclose($fh);  

$url = 'http://www.example.com'; 

$header = array(); 
$header[] = "POST /drm/drm_production_v2.php HTTP/1.1"; 
$header[] = "Content-type: text/xml"; 
$header[] = "content-length: ".$filesize. "\r\n"; 
$header[] = "User-Agent: UserAgent 1.0"; 
$header[] = "Connection: Keep-Alive"; 
$header[] = "Authorization: Basic ".$auth; 
$header[] = "host: www.example.com"; 


$Response = httpsPost($url, $xml_data, $header); 

echo $Response; 

?> 

Он возвращает «плохой запрос» с сервера. Какие-либо предложения?

+0

Вы изменили URL-адрес на www.example.com в журнале wirehark и xml, или вы действительно пытаетесь получить к нему доступ? – Pim

+0

Я изменил его на этот пост. – manny

ответ

2

Мое первое предположение заключается в том, что дополнительный «\ r \ n» после заголовка длины содержимого заставляет сервер думать, что начальный контент начинается там. На всякий случай я также изменил бы «длину контента», «тип контента» и «хост» на «Content-Length», «Contnet-Type» и «Host».

Редактировать: Это и ответ Рональда Бумана.

+0

Извините, Роланд, чтобы ваше имя было неправильным. – GZipp

2

Я думаю, что ваш аргумент

curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data); 

не является правильным. Опция postfields должна быть URL-адресами пар имя/значение. Из документов:

" Это может быть либо принят в качестве urlencoded строки, как„para1 = знач1 & para2 = val2 & ...“или как массив с именем поля в качестве ключа и поля данных в качестве значения If. значение является массивом, заголовок Content-Type будет установлен в MULTIPART/форм-данных "

см http://php.net/manual/en/function.curl-setopt.php

0

Там в pcap2curl инструмент, который позволяет конвертировать PCAP файл HTTP запросов в завиток.

Но если вы хотите воспроизвести некоторые веб-запросы из своего браузера, вы можете сделать это без Wireshark и вместо этого ввести режим веб-разработчика в браузере. Затем вы переходите к просмотру сетевых запросов и щелкаете правой кнопкой мыши по интересующему запросу, тогда в большинстве современных браузеров есть опция Копировать как cURL, после чего вы можете вставить полученную команду в терминал и повторно запустить захваченную команду как вы сочтете нужным, используя инструмент curl. Некоторые браузеры (например, Mozilla) также предлагают возможность редактирования и повторной отправки из браузера.