Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP CURL

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно отправить POST запрос CURL'ом
 

Код:
 
$curl = curl_init();
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');
curl_setopt($curl, CURLOPT_URL, 'https://online.inforkom.ru/private/dologin/?user-name=XXXXXXXXXX&user-pass=XXXXXXXXXXXXXXXXXXXXX');
$html = curl_exec($curl);
 
$post = "cmd=get-records&limit=100&offset=0&search[0][field]=opdate&search[0][type]=date&search[0][operator]=between&search[0][value][]=26.11.2017&search[0][value][]=02.12.2017&searchLogic=AND&sort[0][field]=opdate&sort[0][direction]=desc";
curl_setopt($curl, CURLOPT_URL, 'https://online.inforkom.ru/private/get');
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$html = curl_exec($curl);
echo $html;
 

 
Все аторизируется, но я получаю отсвет:

Код:
{"status": "error", "message": "Request params mismatch"}

 
Данные firebag вкладка POST
 

Код:
 
cmd    get-records
limit    100
offset    0
searchLogic    AND
search[0][field]    opdate
search[0][operator]    between
search[0][type]    date
search[0][value][]    26.11.2017
search[0][value][]    02.12.2017
sort[0][direction]    desc
sort[0][field]    opdate
 

 
Что я не так делаю?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 09:36 02-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011
в сотый раз повторяю, не нужно создавать каждый раз новую тему - ничего нового вы не спрашиваете
http://forum.ru-board.com/forum.cgi?action=filter&forum=31&filterby=topictitle&word=curl
 

Цитата:
Все аторизируется

и куда сохраняется? где CURLOPT_COOKIEJAR?
 

Цитата:
CURLOPT_COOKIEFILE

опция чтения из файла, но не записи в него

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 09:50 02-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Да нет же, я разобрался там нужно было добавить еще пару параметров в переменную $post. И все заработало, а CURLOPT_COOKIEFILE не нужен.

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 09:58 02-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вы меня только не баньте, и сразу не посылайте )))
 
По поводу CURL разобрался, теперь вопрос что мне делать с полученными данными.  
 

Код:
 
$curl = curl_init();  
curl_setopt($curl, CURLOPT_COOKIESESSION, true);  
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile");  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);  
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);  
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');  
curl_setopt($curl, CURLOPT_URL, 'https://online.inforkom.ru/private/dologin/?user-name=XXXXXXXXXX&user-pass=XXXXXXXXXXXXXXXXXXXXX');  
$html = curl_exec($curl);  
 
$post = "cmd=get-records&limit=100&offset=0&search[0][field]=opdate&search[0][type]=date&search[0][operator]=between&search[0][value][]=26.11.2017&search[0][value][]=02.12.2017&searchLogic=AND&sort[0][field]=opdate&sort[0][direction]=desc";  
curl_setopt($curl, CURLOPT_URL, 'https://online.inforkom.ru/private/get');  
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);  
$html = curl_exec($curl);  
echo $html;  
 

 
Получаю массив:
 

Код:
 
{"status":"success","total":36,"records":[
{"id":"81437409","terminalno":"2L7 31 276","fuelstationid_fullname":"Ртом АГНКС-4, г. Томск, ул. Высоцкого, 20/2","cardno":"1000 0210 2817 0999","carnumber":"Е 772 ЕУ 70","opdate":"02.12.2017 18:20:07","checkno":"003766","amount":"10.32","productid_fullname":"КПГ","price":"13.00","currencyid_fullname":"RUB","tramount":"134.16"},
{"id":"81437365","terminalno":"2L7 31 276","fuelstationid_fullname":"Ртом АГНКС-4, г. Томск, ул. Высоцкого, 20/2","cardno":"1000 0210 2817 1004","carnumber":"К 966 ТР 70","opdate":"02.12.2017 18:19:30","checkno":"003765","amount":"12.27","productid_fullname":"КПГ","price":"13.00","currencyid_fullname":"RUB","tramount":"159.51"},
{"id":"81426371","terminalno":"2L7 31 276","fuelstationid_fullname":"Ртом АГНКС-4, г. Томск, ул. Высоцкого, 20/2","cardno":"1000 0210 2817 0997","carnumber":"Е 669 НО 70","opdate":"02.12.2017 13:51:28","checkno":"003761","amount":"22.38","productid_fullname":"КПГ","price":"13.00","currencyid_fullname":"RUB","tramount":"290.94"}
]}
 

 
Не пойму как мне из него вытащить например "carnumber".
 

Код:
 
$.ajax({
    url: 'core.php',
    type: 'POST',
        dataType: 'json',
    data: {module: 'loadgpgmt'},
    cache: false,
    success: function(data){
              $.each(data, function(key, val) {
                  alert(val.carnumber);
              });
    }
});
 

 
Почему то ничего не происходит.

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 15:08 02-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Получаю массив:  

Это не массив, а объект

Цитата:
     $.each(data.records, function(key, val) {  
                  alert(val.carnumber);  
              });  


Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 19:50 02-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Не работает
 

Код:
 
$.each(data.records, function(key, val) {  
   alert(val.carnumber);  
});  
 

 
Смотрю
 

Код:
 
console.log(data.records);
 

 
Получаю "undefined"

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 20:40 02-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
Получаю "undefined"

значит возвращается не json.
помимо самого содержимого в json формате нужно выдавать правильный content-type.
либо самостоятельно парсить строку в js с помощью JSON.parse()

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 22:37 02-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Да я понял уже что возвращается просто строка, но как мне мне парсить?
JSON.parse() тоже ничего не парсит. content-type я задавал в заголовке, ничего не изменилось.
 
А PHP вообще может данные в виде JSON, методом POST отправлять/получать?
 
Ну вроде отправлять как может, "curl_setopt_array". А как ответ то получить в виде JSON?
 
Добавлено:
Ну что не так то я делаю?
 

Код:
 
var jdata;
$.ajax({
    url: 'core.php',
    type: 'POST',
    dataType: 'text',
    data: {module: 'loadgpgmt'},
    cache: false,
    success: function(data){
         jdata = JSON.parse(data);
        $.each(jdata, function(key, val){
                  console.log(key + ' ==== ' + val);
        });
    }
});
 

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 05:48 03-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
content-type я задавал в заголовке

какой?

Цитата:
 jdata = JSON.parse(data);

и нет ошибок в консоли браузера?  нужно вывести что то сразу после parse, чтобы ясно было, что код выполняется дальше
 

Цитата:
А PHP вообще может данные в виде JSON, методом POST отправлять/получать?

json это просто строка, в которой данные представлены определенным образом.
 
будет ли при этом правильное обратное преобразоание и автоматическое или нет - над эти вы и бьетесь.
 
ps: исправленная строка https://jsfiddle.net/oybctqm9/
переносов строк быть не должно

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 07:12 03-12-2017 | Исправлено: Mavrikii, 07:19 03-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
По поводу заголовка

Код:
 
$request_data = array('obj' => '******' , 'summary' => 'tramount' , 'cmd' => 'get-records' , 'limit' => '100' , 'offset' => '0' , 'search[0][field]' => 'opdate' , 'search[0][type]' => 'date' , 'search[0][operator]' => 'between' , 'search[0][value][]' => '01.11.2017' , 'search[0][value][]' => '02.12.2017' , 'searchLogic' => 'AND' , 'sort[0][field]' => 'opdate' , 'sort[0][direction]' => 'desc');
$json = json_encode($request_data);
curl_setopt($curl, CURLOPT_URL, 'https://online.inforkom.ru/private/get/');
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($curl);
echo json_encode($html);
 

 
Тогда я в консоле вижу

Код:
 
Object {status="error", message="Request params mismatch"}
 

 
И снова получается я не правильно указываю где то в $request_data параметр.  
 
 
 
По поводу jdata = JSON.parse(data); Ошибок нет и дальше код выполняется.
 
 
Добавлено:
Обманул, после jdata = JSON.parse(data); код не выполняется
 
Добавлено:
Но если я добавлю echo json_encode($html); то после jdata = JSON.parse(data); код продолжает выполняться

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 07:22 03-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
По поводу заголовка

заголовок ответа js скрипту, а не запроса к стороннему ресурсу!
 

Цитата:
код продолжает выполняться

и вернет все как строку.
 
ps: короче

Код:
header('Content-Type: application/json');
echo $html;

 
если код кривой возвращается со стороннего ресурса и js на него реагирует (с переносами и так далее), то можно попробовать так

Код:
echo json_encode(json_decode($html), JSON_UNESCAPED_UNICODE));

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 07:41 03-12-2017 | Исправлено: Mavrikii, 07:49 03-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
В общем я в тупике, не могу понять какой правильный путь для решения задачи.
Подскажите куда копать то?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 07:48 03-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
Подскажите куда копать то?

читайте внимательно, что вам пишут. не нужно методом тыка что то пытаться сделать, нужно думать. выше написал

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 07:50 03-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что не так я делаю, где то недопонимаю:

Код:
 
echo json_encode(json_decode($html), JSON_UNESCAPED_UNICODE);
 

Возвращает NULL

Код:
 
header('Content-Type: application/json');  
 

ничего не меняет

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 08:04 03-12-2017 | Исправлено: koreets2011, 08:04 03-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
Возвращает NULL

значит у вас в $html невалидный json код.
null возвращается, когда json_decode не может декодировать строку
 

Цитата:
Возвращаемые значения
 
Возвращает данные json, преобразованные в соответствующие типы PHP. Значения true, false и null возвращаются как TRUE, FALSE и NULL соответственно. NULL также возвращается, если json не может быть преобразован или закодированные данные содержат вложенных уровней больше, чем допустимый предел для рекурсий.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 08:05 03-12-2017 | Исправлено: Mavrikii, 08:06 03-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Так я это знаю, я сразу проверил json_decode($html); и он был NULL.  
Я и понять не могу как мне полученный ответ от сервера, парсить.  
Что бы я не делал, ничего не получается.  
Как мне ответ от сервера привести к JSON или Object ?

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 08:13 03-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
Как мне ответ от сервера привести к JSON или Object

я не знаю что и в каком виде вам возвращает сервер. скопированных данных для этого недостаточно
например есть проблемы до и после выражения - сделать trim
но онлайн сендбокс не показывает никаких проблем, значит дело не в этом
 

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 08:14 03-12-2017 | Исправлено: Mavrikii, 08:18 03-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне кажется вот это правильный путь:

Код:
 
$request_data = array('obj' => '******' , 'summary' => 'tramount' , 'cmd' => 'get-records' , 'limit' => '100' , 'offset' => '0' , 'search[0][field]' => 'opdate' , 'search[0][type]' => 'date' , 'search[0][operator]' => 'between' , 'search[0][value][]' => '01.11.2017' , 'search[0][value][]' => '02.12.2017' , 'searchLogic' => 'AND' , 'sort[0][field]' => 'opdate' , 'sort[0][direction]' => 'desc');  
$json = json_encode($request_data);  
curl_setopt($curl, CURLOPT_URL, 'https://online.inforkom.ru/private/get/');  
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");  
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));  
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  
$html = curl_exec($curl);  
echo json_encode($html);  
 

Но тут я в ступаре от ответа сервера

Код:
 
Object {status="error", message="Request params mismatch"}  
 

Неправильный $request_data у меня получается, хотя параметры все верны.

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 08:16 03-12-2017
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
koreets2011

Цитата:
Мне кажется вот это правильный путь

он не имеет смысла. все, что вернется в js скрипт будет "содержимое $html"
 

Цитата:
$json = json_encode($request_data);  

зачем???  что вы докопались с запросом к серверу? он вам возвращает нужные результаты? вот отсюда и нужно копать, а не портить работающий код запроса
 

Цитата:
Но тут я в ступаре от ответа сервера  

потому что POST данные не отправляются в json закодированном виде для данного сервиса (это видно из [0][value][], что данные идут из формы, а не подготавливаются особым образом), работало же нормально, зачем менять?
 
сделали обычный запрос, получили

Цитата:
{"status":"success","total":36,"records":[ ...

и вот раз эти данные json_decode не может преобразовать, значит там что то лишнее, вот с этим и нужно разбираться, а не городить огород.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 08:19 03-12-2017 | Исправлено: Mavrikii, 08:26 03-12-2017
koreets2011



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Что получается то? Ответ от сервера содержит нужные мне данные, но в виде строки. Я не могу привести её не к какому типу данных, не JSON не Object. И получается что нужные данные нельзя ни как использовать, и сидеть мне дальше выгружать/загружать в cvs.
 
Я просто не верю что средствами php и js невозможно реализовать мою задачу.

Всего записей: 410 | Зарегистр. 13-10-2011 | Отправлено: 08:26 03-12-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP CURL


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru