@Ivan9091

Некорректный curl php запрос (xhr)?

Пытаюсь "собрать" по своим старым знаниям PHP скрипт для автозаполнения данных на сайте-агрегаторе пользовательских данных, работающего на asp.net mvc (в нем вообще не соображаю). В чем может быть проблема?
Вот запрос:
function search($url,$postfields){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
   curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
  curl_setopt($ch, CURLOPT_VERBOSE, true);
	$verbose = fopen('./t.txt', 'w+');
	curl_setopt($ch, CURLOPT_STDERR, $verbose);
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_POSTFIELDS,$postfields);
   curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
   curl_setopt($ch, CURLOPT_HEADER, 1);
   curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Accept: application/json, text/javascript, */*; q=0.01",
"Accept-Encoding: gzip, deflate, br",
"Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
"Connection: keep-alive",
"Content-Length: " . strlen($postfields)."",
"Host: site",
"Origin: https://site",
"Referer: https://site/Project/NZS?subsystem=623",
"X-Requested-With: XMLHttpRequest"));
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

   $result=curl_exec($ch);

   curl_close($ch);

   return $result;
}
$udec = [
'draw'	=> "1",
'columns[0][data]'=>	"0",
'columns[0][name]'	=>"",
'search[value]'=>	"",
'search[regex]'	=>"false"]; 

$udec = json_encode ($udec, JSON_UNESCAPED_UNICODE);

 $third = search('https://site/Project/NZS_GetPartData',$udec);

По идее сервер на указанный запрос должен ответить данными JSON, но получаю вот это:
Ошибка сервера в приложении '/'.
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.ArgumentException: The parameters dictionary contains a null entry for parameter 'length' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult NZS_GetPartData(Int32, Int32)' in 'Tip.Controllers.ProjectController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Имя параметра: parameters. 
Трассировка стека:


[ArgumentException: The parameters dictionary contains a null entry for parameter 'length' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult NZS_GetPartData(Int32, Int32)' in 'Tip.Controllers.ProjectController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Имя параметра: parameters]...

Помогите, а то придется вручную вносить тысячи записей.
Curl verbose ошибок не выдал. проблема скорее не в запросе а в ее обработке, этого параметра 'parameters' нет в запросе.
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 2
@rPman
Так тут тебе не смогут помочь, но

Открываешь страницу в браузере, открываешь по F12 консоль разработчика, открываешь вкладку Network, обновляешь, делаешь все необходимые действия как пользователь для отправки запроса... получаешь подробный лог всех сообщений, отправленных серверу.

Правая кнопка на записи, копировать, как curl bash - получишь строку в буфере, которая подробно расписывает какие заголовки и каким должен быть запрос, повторяешь его в php (я в одном месте не смог, была какая то особенность различие в php_curl, так я тупо запускал утилиту curl которая работала)

Вполне возможно сервис ожидает что нужно несколько запросов последовательно (бывают такие программисты не знающие что запросы в REST должны быть с независимыми состояниями, ну это хороший тон)

p.s. одно время старался, симулировал вызовы, но позже понял что гораздо проще и дешевле для разработки (но дороже по ресурсам cpu и ram) симулировать поведение на самом сайте, особенно если код нужно поддерживать несколько лет а сайт и запросы меняются постоянно), делать это можно как инструментами типа selenium так инжектом javascript кода прямо на страницу сайта с помощью чего то типа greasemonkey
Ответ написан
Комментировать
Immortal_pony
@Immortal_pony Куратор тега PHP
Судя по ошибке, сервер ожидал параметра 'parameters', а вы ему его не прислали.
Пальцем в небо, ожидался он тут:

$udec = [
    'parameters' => [ // <-- вот тут
        'draw' => "1",
        'columns[0][data]' => "0",
        'columns[0][name]' => "",
        'search[value]' => "",
        'search[regex]'	=> "false"
    ]
];


Ну а реально проанализировать можно будет только если вы опубликуете документацию API, к которому стучитесь.
Потому что без неё невозможно понять, правильно вы составляете запрос или нет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 16:26
3000 руб./за проект
03 мая 2024, в 16:09
1200 руб./за проект
03 мая 2024, в 16:06
3000 руб./за проект