powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вопрос по модулю cURL
2 сообщений из 2, страница 1 из 1
PHP: Вопрос по модулю cURL
    #39824701
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня тестовый скрипт для веб-сервиса:
Код: plaintext
1.
2.
3.
curl -d 'phone=79876543210&partner=abcd&app_version=1234' \
  --data-urlencode 'sign=binary-in-base64=' \
   https://api.site.ru/method/ 
Данный код передает в веб-сервис тестовые данные и возвращает результат.

Также у меня есть рабочий код на PHP, делающий то же самое.
Весь код достаточно объемный, но та часть, которая соответствует тестовому скрипту, примерно такая:
Код: php
1.
2.
3.
4.
5.
6.
curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->curl, CURLOPT_POST, true);
curl_setopt($this->curl, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($this->curl, CURLOPT_URL, $url);
$res = curl_exec($this->curl);


Здесь $params это массив с параметрами ['phone'=>'79876543210', 'partner'=>'abcd', 'app_version'=>'1234', 'sign'=>'base64'].
http_build_query преобразует его в соответствии со стандартными правилами экранирования для аргументов, то есть символ "=" в base64-закодированной строке превращается в %3D.
Этот код успешно работает и возвращает ответ от веб-сервиса.

Также у меня есть подобный код на Perl.
По идее он делает то же самое, и использует для экранирования функцию uri_escape_utf8.
Но почему-то веб-сервис для скрипта на Perl возвращает ошибку, сообщая что не указан обязательный аргумент app_version.
Хотя этот параметр в запросе присутствует и передается в теле запроса (в body).

Код: plaintext
'_content' => 'partner=XXXXXXXXXXX&phone=79XXXX80218&sign=UXXXXXXXXFXl%2FUlXcfcp8KKaFbNMwx%2FQSLifhYXm%2B2qYCH890gYU8G3XaWhIB9fomuYUqyvHvbeDohrFtutyHM%2BF1OxIHuhiPjDE7Jn82rwhXB1skfhy5exF7WdQAuDxay8zGqcTvyApT62ThptWL1VWNScdzd%2BW78sRbouZKCm8pDF0EfTETXMap91n09yEPyVBg1M2zoEBzXXXXXXXXyI8lFVyE4cxnx%2BJAl7MioQJ0MH1%2F1QQgoX34MGfCbydN1e9WAYkOfWgUIGNft1jGZw59e1BjuXXXXXXXXvL9GBKP7I0HzlfvRfOsL947cgnUg%2BmwsLl7vPrkn9eiyJAoCn8Mri3P9BLFzBqx%2B8McvVHgLLVAnjpYsRSAzvC6bx9ZXWW9i4lQCwoyTXZzuXNuSA5L%2F8KmuwBS4ePxDd%2BYZuSuPdFzMefwaXsEEnfhfhF2rZV%2FG5ya%2B6MTKdJs%2BNVxMHJsU8Wa9qWtAvXXXXXXXXHItNJ6y%2FLLTF2zg%2Ft%2FdswfB%2FpTfgSqyHjs93PbTUM1x8y1E6uGn%2Ft8DSRej3PF%2Fwa4GWzOdAZJkZ9voytMhy1sIC%2BMCRsxcZoiVUNysyKT%2B9fjr5py7s2feYucdmJ4l0Xz8K7EfIkZNm2ukEkkeXZ8NNJoZ80vYtcG%2BewRPBaQomR9etcL74ViC%2F2KFOj8Xk%3D&app_version=8424'


В обоих скриптах я делал отладочный вывод сформированной строки с параметрами, но никакой разницы не заметил.
Единственное предположение — это cURL отправляет на сервер не те данные, которые, как я думаю, он должен отправлять.
Можно ли в модуле включить режим отладки, чтобы увидеть сырые данные, которые уходят на сервер?
Сервис использует протокол https, поэтому просмотреть данные сниффером я не могу, а проксировать слишком замороченно.
...
Рейтинг: 0 / 0
PHP: Вопрос по модулю cURL
    #39824706
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опция CURLOPT_VERBOSE в итоге помогла, хоть и не ожидал от нее пользы, она не фиксирует содержимое, только заголовки.
Однако в процессе просмотра заголовков выяснилось, что cURL автоматически добавляет заголовок "Content-Type: application/x-www-form-urlencoded" для POST. А скрипт на Perl использует более низкоуровневую библиотеку, которая заголовок автоматически не выставляет.
Добавил заголовок, все заработало.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вопрос по модулю cURL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]