Невозможно получить ответ json от API с помощью curl в PHP - PullRequest
0 голосов
/ 25 марта 2019

Я работаю над веб-страницей, где пользователь будет вводить номер, который будет использоваться в качестве параметра запроса для вызова API, и должен отобразить ответ на веб-странице. Я запускаю этот локальный Mac с php-сервером, работающим на том же Mac, используя следующую команду

php -S localhost:8080 -t /Users/demouser/my_website

Я подтвердил, что curl включен с помощью phpinfo ().

У меня есть ниже функция в файле HTML, которая будет вызываться при нажатии кнопки, используя JavaScript.

function performRequest(todoid) {
        $.ajax({
            url:"api_call.php", 
            type: "GET", 
            data: { todoid: todoid },
            success:function(result){
                console.log("JS result"+result);
           }
        });
    }

Мой PHP-файл выглядит ниже

    <?php
    if (isset($_GET['todoid'])) 
    {
        callExternalAPI($_GET['todoid']);
    }

    function callExternalAPI($todoid) 
    {
        $result = callAPI("https://jsonplaceholder.typicode.com/todos/".$todoid);
        print_r("Result from URL".$result);
        $info = json_decode($result, true);
        echo("Info from API".$info);
    }

    function callAPI($url)
    {
        $curlObj = curl_init();
        curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curlObj, CURLOPT_ENCODING, "identity");
        curl_setopt($curlObj, CURLOPT_URL, $url);
        if (!$result = curl_exec($curlObj))
        {
            echo "Failed to perform request".curl_error($curlObj);
        }
        curl_close($curlObj);
        return $result;
    }
?>

Но при успешном обратном вызове Ajax я получаю

JS resultResult from URLhttps://jsonplaceholder.typicode.com/todos/1Info from API

Когда я нажимаю один и тот же API в браузере или почтальоне, я получаю правильный ответ json. Я не очень понимаю, чего мне здесь не хватает. Может кто-нибудь, пожалуйста, помогите мне понять проблему? Спасибо

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Возможно, может помочь следующее - поскольку конечной точкой является https, в функции запроса curl должны быть установлены дополнительные параметры для работы с SSL.Функция curl, приведенная ниже, является упрощенной версией того, что я часто использую

<code><?php

    /* /9412499/nevozmozhno-poluchit-otvet-json-ot-api-s-pomoschy-curl-v-php */
    /* jsonplaceholder.typicode.com api experiments */


    if( isset( $_GET['todoid'] ) ){

        $id=filter_input( INPUT_GET, 'todoid', FILTER_SANITIZE_NUMBER_INT  );

        /* utility to quickly display data in readable fashion */
        function pre( $data=false, $header=false, $tag='h1' ){
            if( $data ){
                $title = $header ? sprintf('<'.$tag.'>%s</'.$tag.'>',$header) : '';
                printf('%s<pre>%s
', $ title, print_r ($ data, 1));}} / * основной помощник запроса curl * / function curl ($ url) {/ * установить соответствующий путь к ВАШЕМ файлу cacert.pem * / $ cacert = 'c: /wwwroot/cacert.pem';$ Завиток = curl_init ();if (parse_url ($ url, PHP_URL_SCHEME) == 'https') {curl_setopt ($ curl, CURLOPT_SSL_VERIFYPEER, true);curl_setopt ($ curl, CURLOPT_SSL_VERIFYHOST, 2);curl_setopt ($ curl, CURLOPT_CAINFO, $ cacert);} curl_setopt ($ curl, CURLOPT_URL, trim ($ url));curl_setopt ($ curl, CURLOPT_AUTOREFERER, true);curl_setopt ($ curl, CURLOPT_FOLLOWLOCATION, true);curl_setopt ($ curl, CURLOPT_FAILONERROR, true);curl_setopt ($ curl, CURLOPT_HEADER, false);curl_setopt ($ curl, CURLINFO_HEADER_OUT, false);curl_setopt ($ curl, CURLOPT_RETURNTRANSFER, true);curl_setopt ($ curl, CURLOPT_USERAGENT, 'Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 58.0.3029.110 Safari / 537.36');curl_setopt ($ curl, CURLOPT_MAXREDIRS, 10);curl_setopt ($ curl, CURLOPT_ENCODING, '');$ res = (object) array ('response' => curl_exec ($ curl), 'info' => (object) curl_getinfo ($ curl), 'errors' => curl_error ($ curl));curl_close ($ curl);вернуть $ res;} function callapi ($ id) {$ url = sprintf ('https://jsonplaceholder.typicode.com/todos/%s',$id);вернуть curl ($ url);} / * вызвать API * / $ res = callapi ($ id);/ * обрабатывать данные ответа * / if ($ res && $ res-> info-> http_code == 200) {/ * для отладки * / pre ($ res-> response, 'Response data');/ * live * / #exit ($ res-> response);}}?>

Пример вывода:

Данные ответа

{
  "userId": 2,
  "id": 23,
  "title": "et itaque necessitatibus maxime molestiae qui quas velit",
  "completed": false
}
0 голосов
/ 25 марта 2019

Хорошо, сначала в вашем вызове ajax добавьте:

 url:"api_call.php", 
            type: "GET", 
            data: { todoid: todoid },
            dataType : "json",

После этого у вас ошибка в php. Вы пытаетесь отобразить массив.

$info = json_decode($result, true);   // this line will get you an array
print_r($info);   // this is the way to print the array. Echo is used for strings

Просто небольшое предложение. Я не вижу смысла возвращать json и массив с теми же данными в успехе ajax. Верните только свой json и обработайте данные с помощью javascript.

Что вы можете сделать, это просто использовать эту строку кода, которая у вас уже есть:

echo("Result from URL".$result); // you can echo that one since it's just a json string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...