Как использовать массивы в запросах cURL POST с PHP - PullRequest
0 голосов
/ 07 сентября 2018

Мне интересно, как мне сделать так, чтобы этот код поддерживал массивы?

Я пытаюсь отправить параметры через php curl в скрининге акций, чтобы получить результат на этой странице: https://finance.yahoo.com/screener/unsaved/f0171a68-053e-42f2-a941-d6ecdf2ba6d1?offset=25&count=25 параметры вот мой php код

<?php

$url = 'https://query1.finance.yahoo.com/v1/finance/screener?lang=en-US&region=US&formatted=true&corsDomain=finance.yahoo.com';
// $url = 'https://finance.yahoo.com/screener/unsaved/f0171a68-053e-42f2-a941-d6ecdf2ba6d1';



 $parameters =
  [
   'size' => 25,
   'offset' => 50,
   'sortField' => 'intradaymarketcap',
   'sortType' => 'DESC',
   'quoteType' => 'EQUITY',
   'topOperator' => 'AND',
   'query' => array(
        'operator' => 'AND',
        'operands'=> array(
            'operator' => 'or',
            'operands' => array(
                'operator' => 'EQ',
                'operands' =>  array("region","jp")  
            )
        )
    ),
   'userId' => 'HFEELK3VBE3KPE4MGEA6PZTXXL',
   'userIdType' => 'guid'
  ];
  $parameters = json_encode($parameters);

  $headers =
  [
   'Accept: application/json, text/javascript, */*; q=0.01',
   'Accept-Language: en-US,en;q=0.5',
   'X-Requested-With: XMLHttpRequest',
   'Connection: keep-alive',
   'Pragma: no-cache',
   'Cache-Control: no-cache',
  ];
  $cookie = tmpfile();
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.31');
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters));
  // curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

  $response = curl_exec($ch);
  curl_close($ch);

  var_dump($response);

?>

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Рабочий пример

$data=array();
$data['amount']=100;
$data['to']='test';
$json=json_encode($data);
$header = array('Content-Type: application/json');
$handle = curl_init($url);
    curl_setopt($handle, CURLOPT_POST, true);
    curl_setopt($handle,CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($handle, CURLOPT_POSTFIELDS, $json);
    curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
$response=curl_exec($handle);
0 голосов
/ 07 сентября 2018

спасибо pr1nc3 и Гурпалу Сингху

я изменил эту строку

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters));

для этого

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($parameters,true));

но у меня всегда такой результат

'{"error":{"result":null,"error":{"code":"internal-error","description":"STREAMED"}}}'

и здесь код

<?php

    $url = 'https://query1.finance.yahoo.com/v1/finance/screener?lang=en-US&region=US&formatted=true&corsDomain=finance.yahoo.com';
    // $url = 'https://finance.yahoo.com/screener/unsaved/f0171a68-053e-42f2-a941-d6ecdf2ba6d1';

    $parameters =
    [
   'size' => 25,
   'offset' => 50,
   'sortField' => 'intradaymarketcap',
   'sortType' => 'DESC',
   'quoteType' => 'EQUITY',
   'topOperator' => 'AND',
   'query' => array(
        'operator' => 'AND',
        'operands'=> array(
            'operator' => 'or',
            'operands' => array(
                'operator' => 'EQ',
                'operands' =>  array("region","jp")  
            )
        )
    ),
   'userId' => 'HFEELK3VBE3KPE4MGEA6PZTXXL',
   'userIdType' => 'guid'
  ];

  $headers =
  [
   'Accept: application/json, text/javascript, */*; q=0.01',
   'Accept-Language: en-US,en;q=0.5',
   'X-Requested-With: XMLHttpRequest',
   'Connection: keep-alive',
   'Pragma: no-cache',
   'Cache-Control: no-cache',
  ];
  $cookie = tmpfile();
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.31');
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($parameters,true));
  // curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters));
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

  $response = curl_exec($ch);
  curl_close($ch);

  var_dump($response);

?>

Я думаю, что ошибка в переменных $ параметров, но я не вижу, где

когда я сравниваю исходный вид отправки

{"size":25,"offset":0,"sortField":"intradaymarketcap","sortType":"DESC","quoteType":"EQUITY","topOperator":"AND","query":{"operator":"AND","operands":[{"operator":"or","operands":[{"operator":"EQ","operands":["region","jp"]}]}]},"userId":"HFEELK3VBE3KPE4MGEA6PZTXXL","userIdType":"guid"}

с моей переменной $ parameters, есть различия

{"size":25,"offset":0,"sortField":"intradaymarketcap","sortType":"DESC","quoteType":"EQUITY","topOperator":"AND","query":{"operator":"AND","operands":{"operator":"or","operands":{"operator":"EQ","operands":["region","jp"]}}},"userId":"HFEELK3VBE3KPE4MGEA6PZTXXL","userIdType":"guid"}
0 голосов
/ 07 сентября 2018
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters));

Измените эту строку. Если ваша проблема в том, что вы можете отправить тело через curl, то, вероятно, вам нужно отправить его как json, поэтому попробуйте

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($parameters,true));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...