Arhn - архитектура программирования

Curl ничего не возвращает с помощью функции, но возвращает объект json в терминале. Как отлаживать?

Это URL-адрес, из которого я пытаюсь получить контент:

$url = 'http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json';

Итак, я попробовал file_get_contents(), и он работает нормально. Затем я попробовал эту функцию, которая всегда работала, но не в этом случае.

class SimpleCurl 
{

    public static function get($url, $params=array()) 
    {
        $url = $url . '?' . http_build_query($params, '', '&');
        $ch = curl_init();

        $options = [
            CURLOPT_URL             => $url,
            CURLOPT_RETURNTRANSFER  => true,
            CURLOPT_CONNECTTIMEOUT  => 10,
            CURLOPT_SSL_VERIFYPEER  => false
        ];
        curl_setopt_array($ch, $options);

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

        return $response;
    }

}

Затем я попытался использовать терминал со следующей командой:

curl -X GET "http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json"

И это сработало. Он без проблем вернул правильный объект JSON. Может кто-нибудь, пожалуйста, дайте мне знать, как вы отлаживаете CURL и выясняете, в чем здесь проблема?

После дальнейших тестов и отладки я заметил следующее. Поскольку моему проекту требуется объект JSON, я передаю полученный CURL $content через $json_data = json_decode($content);, и он ничего не возвращает. Пустой!

Но если я попытаюсь выполнить echo или print_r до того, как он пройдет через json_decode(), я буквально получу некоторую RAW-информацию/текст, а не объект JSON. Что за...

23.02.2015

  • Как вы вызываете свою функцию get (т.е. какие аргументы вы предоставляете)? Я могу изучить его и добавить решение для вашего конкретного случая в свой ответ. 23.02.2015
  • Что показывает echo $url;? 23.02.2015
  • $content = SimpleCurl::get($this->credentials['NETWORK_URL']); Где $this->credentials['NETWORK'URL'] = к переменной $url сверху. 23.02.2015
  • @dvLden снова. Мы уже видели URL ниже. Я спросил, что echo $url; показывает внутри этого метода. Возможно, он неправильно сформирован. Кроме того, я почти уверен, что RETURNTRANSFER должно быть 1 вместо true. 23.02.2015

Ответы:


1

Вы не передаете $params функции get, и ваше $url заканчивается как http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json? обратите внимание на добавленный ?

Вы можете изменить функцию get, чтобы объединять строку запроса только тогда, когда $params не пусто, примерно так:

...
if (!empty($params)){     
   $url = $url . '?' . http_build_query($params, '', '&');
} 
23.02.2015
  • Не передает параметры. URL-адрес сгенерирован и готов к выполнению curl. 23.02.2015
  • Да, но вы понимаете, что добавляете дополнительные ? к $url внутри функции? 23.02.2015
  • Проклятье! Я этого не заметил! Что ж, спасибо, это решает мою проблему. 23.02.2015

  • 2

    Вы должны использовать CURLOPT_VERBOSE для вывода отладочной информации:

    CURLOPT_VERBOSE — TRUE для вывода подробной информации. Записывает выходные данные в STDERR или в файл, указанный с помощью CURLOPT_STDERR.

    Хотя, если вы запускаете свой скрипт в браузере, вы не увидите подробный журнал, потому что по умолчанию он выводит всю информацию в stderr (обычно этот вывод можно увидеть в вашем error.log).

    Таким образом, чтобы увидеть зарегистрированную информацию, вы должны либо заглянуть в свой error.log, запустить свой скрипт в терминале, либо предоставить другой обработчик файлов для cURL для вывода журнала. В самом простом случае вы можете просто перенаправить вывод на stdout следующим образом:

    $options = [
        CURLOPT_VERBOSE => true,
        CURLOPT_STDERR => fopen('php://stdout', 'w'),
        ...
    ];
    

    В этом случае вы увидите свой журнал в своем браузере. Или, в качестве альтернативы, вы можете указать любое другое имя файла для fopen, чтобы вывести журнал в файл.

    Ссылка: http://php.net/manual/en/function.curl-setopt.php

    23.02.2015
  • Я не получил никакой информации, установив ее в массиве параметров внутри функции. 23.02.2015
  • @dvLden, я считаю, что вам также следует предоставить обработчик файлов CURLOPT_STDERR, если вы запускаете свой скрипт в браузере. Вы не получаете никакой информации, потому что она выводится в stderr (который не виден в браузере). Я обновлю свой ответ в ближайшее время. 23.02.2015
  • @dvLden Я обновил свой ответ - теперь, надеюсь, вы сможете лучше отлаживать свои запросы cURL! :) 23.02.2015
  • Эм, что должно произойти сейчас. Будет ли он что-то выводить, если все правильно, или я должен сейчас специально создать задачу, чтобы увидеть это в браузере? 23.02.2015
  • @dvLden, нет, он просто предоставит эмпирические данные, выводя ваши HTTP-запросы и ответы (независимо от того, верны они или нет). Но если есть проблема, вы можете сразу увидеть, где она находится. Вы можете получить те же результаты, указав флаг -v для curl в консоли — например, попробуйте curl -v https://google.com, вы поймете, что я имею в виду. 23.02.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..