Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > в каком формате curl вставляет данные в запрос


Автор: Lipetsk 30.5.2013, 13:16
есть рабочий код на php
Код

$string = array('reg' => 'la-la-la', 'sign' => '6543');
 
$ch = curl_init();  
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_URL, 'https://some.domain.ru');
curl_setopt($ch, CURLOPT_FAILONERROR, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $string); 

$result = curl_exec($ch);


мне нужно этот же POST-запрос выполнить не на сервере а на клиенте, а для этого нужно понять что вставляется в тело запроса
пробовал reg=la-la-la&sign=6543 но не угадал

Спасибо всем отвечающим

Автор: krypt3r 30.5.2013, 13:53
Почитайте в мане внимательно о CURLOPT_POSTFIELDS. Там все описано.

Автор: Lipetsk 30.5.2013, 14:07
в мануале я нашел только что
Цитата

This parameter can either be passed as a urlencoded string like 'para1=val1&para2=val2&...' or as an array with the field name as key and field data as value. If value is an array, the Content-Type header will be set to multipart/form-data.

брал отсюда http://php.net/manual/en/function.curl-setopt.php 

Автор: krypt3r 30.5.2013, 14:14
На это я и намекал — отправляются запросы с разным Content-Type

Автор: Lipetsk 30.5.2013, 14:24
нет, XmlHttp.SetRequestHeader("Content-Type", "multipart/form-data") не помогает

еще я знаю, как посмотреть заголовок и тело ответа, полученного от curl_exec($ch);
а можно ли как-то посмотреть тело POST-запроса, что бы можно было точно увидеть, что curl отправляет?

Автор: Fortop 30.5.2013, 20:03
Цитата(Lipetsk @  30.5.2013,  14:24 Найти цитируемый пост)
а можно ли как-то посмотреть тело POST-запроса, что бы можно было точно увидеть, что curl отправляет? 

Он отправляет ровно то, что вы ему говорите отправить
формат HTTP протокола гуглите.

Для просмотра сетевого трафика пользуйтесь Fiddler2 или Wireshark

Автор: cia 30.5.2013, 22:57
Есть специализированный софт. Снифер называется. Существует большое количество как платных так и бесплатных. Для подобных задач в Windows я пользуюсь IPSniffer.

Добавлено через 4 минуты и 44 секунды
Запускаем снифер, затем запускаем скрипт (на localhost разумеется), затем останавливаем снифер. Фильтруем пакеты и находим среди них post-данные.
Но для данного кода это не обязательно итак видно, что в пост всего два параметра, эмулировать которые можно так:
Код

<form action="https://some.domain.ru" method="post">
<input type="hidden" name="reg" value="la-la-la">
<input type="hidden" name="sign" value="6543">
</form>


Добавлено через 7 минут и 36 секунд
Кстати, CURL_OPT_POST_FIELDS ожидает получить строку, а не массив.

Автор: Nett 30.5.2013, 23:28
Надо массив пропустить через http_build_query(), потом подставь в CURLOPT_POSTFIELDS.
В любом случае это надо для POST запроса, или PUT / DELETE, но тогда не хватает опции CURLOPT_CUSTOMREQUEST.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51a727616ccc19f403000002#findElement_E7045_51a7b6866ccc198813003eac_0

Автор: baldina 31.5.2013, 00:36
Цитата(Lipetsk @  30.5.2013,  14:24 Найти цитируемый пост)
XmlHttp.SetRequestHeader("Content-Type", "multipart/form-data") не помогает

какое-то ацкое смешение javascript и php или я чего то не понимаю...

Цитата(Lipetsk @  30.5.2013,  14:24 Найти цитируемый пост)
ожно ли как-то посмотреть тело POST-запроса, что бы можно было точно увидеть, что curl отправляет?

Цитата(Fortop @  30.5.2013,  20:03 Найти цитируемый пост)
Для просмотра сетевого трафика пользуйтесь

Цитата(cia @  30.5.2013,  22:57 Найти цитируемый пост)
Запускаем снифер

есть путь проще: прочитать man
Цитата

CURLOPT_POSTFIELDS
Pass a void * as parameter, which should be the full data to post in a HTTP POST operation. You must make sure that the data is formatted the way you want the server to receive it. libcurl will not convert or encode it for you. Most web servers will assume this data to be url-encoded.

так что 
Цитата(Fortop @  30.5.2013,  20:03 Найти цитируемый пост)
Он отправляет ровно то, что вы ему говорите отправить


Цитата(Lipetsk @  30.5.2013,  14:24 Найти цитируемый пост)
еще я знаю, как посмотреть заголовок и тело ответа, полученного от curl_exec($ch);

Код

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_HEADER, 1);
$response = curl_exec($ch);
$header_size = curl_getinfo($ch,CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);


Автор: krypt3r 31.5.2013, 06:49
Кстати, а что за другой язык? Может быть, поможет libcurl?

Автор: Lipetsk 31.5.2013, 08:40
почитайте внимательнее мой пост
код рабочий, т.е. с CURLOPT_POSTFIELDS передаётся именно Array, а не строка
вопрос только в том, что curl вставляет в тело пакета вместо этого массива

ладно, попробую установить на свой компьютер Denwer и воспользоваться снифером
только не уверен, что Fiddler2 тут поможет, т.к. он по сути является прокси, а Appache будет лезть в интернет напрямую -- в обход прокси

Автор: ksnk 31.5.2013, 09:49
Lipetsk, Неплохо бы выяснить язык программирования. Для всех из них существуют примеры веб приложений. 

Автор: baldina 31.5.2013, 11:12
Цитата(Lipetsk @  31.5.2013,  08:40 Найти цитируемый пост)
вопрос только в том, что curl вставляет в тело пакета вместо этого массива

вставляет curl который php, но не curllib

Цитата(Lipetsk @  31.5.2013,  08:40 Найти цитируемый пост)
ладно, попробую установить на свой компьютер Denwer и воспользоваться снифером

http://ru.wikipedia.org/wiki/Multipart/form-data

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)