Как создать json объекта в ответе cURL в php - PullRequest
3 голосов
/ 19 марта 2020

Мне просто нужна помощь по этой проблеме. Вот что я хотел достичь в своем выводе php, так как это структура, которая нужна. Массив объектов событий, возвращаемых как JSON.

[
    {
        "page_item_url":"2111",
        "data":{
            "startTime":"11:00"
            "endTime":"12:00",
            "summary":"<p>This has html tags in it from API<p>"
        }
    },{
        "page_item_url":"2112",
        "data":{
            "startTime":"11:00"
            "endTime":"12:00",
            "summary":"<p>This has html tags in it from API<p>"
        }
    }
]

Возвращенный JSON должен быть таким, это был вызов из API с использованием cUrl. У меня есть функция, которая сначала получает все идентификаторы, и я передаю ее в переменную;

function getOpportunityYearly(){
    //curl here...
    //I pushed all the ID in my array to the global scope
}

Итак, теперь у меня есть массив идентификаторов:

   $events = [2111,2112,2113,2114,2115];//etc
   $jsonResponse = [];

, в котором я бы Я хотел бы выполнить l oop и вызвать еще один cUrl из API, который затем следует протолкнуть через $ jsonResponse. Моя проблема заключается в том, что я передаю возвращенный ответ из getEventByID и преобразовываю его в json структура не верна.

for($i=0;$i<count($events);$i++){
    getEventByID($events[$i]);
}

function getEventByID($eventID){
    curl = curl_init();
    curl_setopt_array($curl, array(
    CURLOPT_URL =>'https://sampleapi.com/api/v3/data/opportunities/'.$eventID.'?key='.$GLOBALS['API_KEY'].'&fields=["startTime","endTime","physicalDifficulty","summary"]&where={"whereType":"AND","clauses":[{"fieldName":"displayToPublic","operator":"checked"}]}',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",

    $response = json_decode(curl_exec($curl));
    curl_close($curl);
    $record = $response->records[0];

    return json_encode([[
      "page_item_url"=> $record->opportunities_id->value,
        "data"=>[
          "startTime"=>$record->startTime->displayValue,
          "endTime"=>$record->endTime->displayValue,
          "summary"=>$record->summary->displayValue,
          ]
    ]],JSON_HEX_QUOT | JSON_HEX_TAG);

}

Возвращение функции getEventByID должно иметь формат json, как в приведенном выше примере json, когда я пытаюсь использовать код, возвращенный из getEventByID, для одного объекта, хорошо, см. https://prnt.sc/ris9g7 но когда я пу sh сначала отвечаю на глобальную переменную массива, а затем кодирую его, получается что-то вроде https://prnt.sc/risjw5

Я попытался создать массив и пу sh все возвращается из getEventByID, но вывод не является строкой JSON, это был массив. Я делаю что-то не так.

Когда я использую forl oop, страница была медленной, и она получала максимальный тайм-аут 30 секунд, я попытался использовать $ curl, CURLOPT_TIMEOUT_MS и установить его на 5 минут. Но есть ли другой способ сделать этот CURL не медленным? Или это нормально, поскольку мы получаем все объекты событий ID из API? Можете ли вы посоветовать что-нибудь, чтобы улучшить это?

Это возвращаемый тип из getEventByID https://prnt.sc/ris8zx Так я создаю и возвращаю одно событие из ответа curl https://prnt.sc/ris9c0 Это правильное значение, которое я получил https://prnt.sc/ris9g7 как бы то ни было, если я уберу скобки в коде json_encode и просто передам массив значений ключа asso c, затем pu sh в массив

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

РЕДАКТИРОВАТЬ: Окончательно решен скручивать несколько запросов с помощью мульти керла. Вот учебник ссылка На идентификатор, если событие будет обработано и вызовет запрос скручивания к API. И создайте ассо c массив. После завершения я закодировал jsonResponse как JSON.

function multiCurl($eventArray){
    // array of curl handles
    $multiCurl = array();

    // data to be returned
    $result = array();

    // multi handle
    $mh = curl_multi_init();

    foreach ($eventArray as $event) {
        //$event are the ID per each event
        // URL from which data will be fetched
       // $curl = curl_init();
        $multiCurl[$event] = curl_init();
        curl_setopt_array($multiCurl[$event], array(
          CURLOPT_URL =>'https://api.civicore.com/voc/api/v3/data/opportunities/'.$event.'?key='.$GLOBALS['API_KEY'].'&fields=["opportunityName","typeOfWork","firstDateInOpportunity","lastDateInOpportunity","startTime","endTime","physicalDifficulty","minimumAge","location","state","city","county","campingAvailable","groupsAllowed","registrationFormID","cRQ_payment","paymentAmount","additionalInformation","photo","displayToPublic","latitude","longitude","summary","description","photo"]&where={"whereType":"AND","clauses":[{"fieldName":"displayToPublic","operator":"checked"}]}',
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 0,
          CURLOPT_FOLLOWLOCATION => true,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "GET"
        ));
        curl_multi_add_handle($mh, $multiCurl[$event]);
    }

    do {
      curl_multi_exec($mh,$index);
    } while($index > 0);

      // get content and remove handles
      foreach($multiCurl as $key=>$value) {

        $records = json_decode(curl_multi_getcontent($value));//response of each request
        $record  = $records->records[0];

       if(strtolower($record->displayToPublic->displayValue) == 'yes'){
          $eve =  [ 
            "page_item_url"=> $record->opportunities_id->value,
              "data"=>[
                "startTime"=>$record->startTime->displayValue,
                "endTime"=>$record->endTime->displayValue,
                "summary"=> $record->summary->displayValue
                ]
              ];
          array_push($GLOBALS["jsonResponse"],$eve);
        }
        curl_multi_remove_handle($mh, $value);
      }//foreach
    curl_multi_close($mh);
}

0 голосов
/ 19 марта 2020

У вас есть некоторые синтаксические ошибки в примере кода. Однако, пожалуйста, попробуйте это.

<?php
function getEventByID($eventID)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => 'https://sampleapi.com/api/v3/data/opportunities/' . $eventID . '?key=' . $GLOBALS['API_KEY'] . '&fields=["startTime","endTime","physicalDifficulty","summary"]&where={"whereType":"AND","clauses":[{"fieldName":"displayToPublic","operator":"checked"}]}',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
    ));
    $response = json_decode(curl_exec($curl));
    curl_close($curl);
    $record = $response->records[0];

    return json_decode(json_encode([
        "page_item_url" => $record->opportunities_id->value,
        "data" => [
            "startTime" => $record->startTime->displayValue,
            "endTime" => $record->endTime->displayValue,
            "summary" => $record->summary->displayValue,
        ]
    ], JSON_HEX_QUOT | JSON_HEX_TAG));
}

$events = [2111, 2112, 2113, 2114, 2115]; //etc
$jsonResponse = [];

for ($i = 0; $i < count($events); $i++) {
    $jsonResponse[] = getEventByID($events[$i]);
}

print_r($jsonResponse);

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