【问题标题】:How to get data from API - php - curl如何从 API 获取数据 - php - curl
【发布时间】:2017-07-14 20:26:06
【问题描述】:

如何从 api url 获取数据(图片)?

API 结果:

info = { "title" : "aaaaa", "image" : "bbbbb" };

API 网址:

http://www.example.com/api

代码:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/api');
$result = curl_exec($ch);
curl_close($ch);
$obj = json_decode($result);
echo $result->image;
?>
Array
(
    [curlResult] => info = { "title" : "aaaaa", "image" : "bbbbb" };
    [info] => Array
        (
            [url] => http://127.0.0.1/api.txt
            [content_type] => text/plain
            [http_code] => 200
            [header_size] => 237
            [request_size] => 55
            [filetime] => -1
            [ssl_verify_result] => 0
            [redirect_count] => 0
            [total_time] => 0
            [namelookup_time] => 0
            [connect_time] => 0
            [pretransfer_time] => 0
            [size_upload] => 0
            [size_download] => 48
            [speed_download] => 48
            [speed_upload] => 0
            [download_content_length] => 48
            [upload_content_length] => 0
            [starttransfer_time] => 0
            [redirect_time] => 0
            [certinfo] => Array
                (
                )

            [primary_ip] => 127.0.0.1
            [primary_port] => 80
            [local_ip] => 127.0.0.1
            [local_port] => 61662
            [redirect_url] => 
        )

    [errno] => 0
    [error] => 
)

【问题讨论】:

    标签: php api curl


    【解决方案1】:

    尝试调试此问题的一个好方法是检查 curl 信息数组或 curl 错误。

    <?php
    /**
     * Handles making a cURL request
     *
     * @param string $url         URL to call out to for information.
     * @param bool   $callDetails Optional condition to allow for extended       
     *   information return including error and getinfo details.
     *
     * @return array $returnGroup cURL response and optional details.
     */
    function makeRequest($url, $callDetails = false)
    {
      // Set handle
      $ch = curl_init($url);
    
      // Set options
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
      // Execute curl handle add results to data return array.
      $result = curl_exec($ch);
      $returnGroup = ['curlResult' => $result,];
    
      // If details of curl execution are asked for add them to return group.
      if ($callDetails) {
        $returnGroup['info'] = curl_getinfo($ch);
        $returnGroup['errno'] = curl_errno($ch);
        $returnGroup['error'] = curl_error($ch);
      }
    
      // Close cURL and return response.
      curl_close($ch);
      return $returnGroup;
    }
    
    $url = /* some url */
    $response = makeRequest($url, true);
    
    // Check your return to make sure you are making a successful connection.
    echo '<pre>';
    print_r($response);
    ?>
    

    看看你是否成功地建立了连接,以及你在响应中得到的确切信息,应该让你更好地了解如何处理它。

    编辑

    似乎有一些非 JSON 字符串数据阻止了 json_decode 函数工作。这不太理想,但它确实发生了。在这种特定情况下,以下方法应该会有所帮助,但这只是涉及不良数据问题的一种解决方法。

    // continuing from above :) formatted for readability
    
    /**
     * Separates JSON string from unnecessary data, parses into
     * an object and returns.
     *
     * @param string $curlResult String returned from cURL call.
     *
     * @return object $jsonObject Parsed JSON object. 
     */
    function cleanJsonString($curlResult) {
      // Separates result string into array at " = ".
      $responseChunks = explode(" = ", $curlResult);
    
      // Removes semicolon from end of JSON string.
      $jsonString = substr($responseChunks[1], -1);
    
      // Parse JSON string into object.
      $jsonObject = json_decode($jsonString);
    
      return $jsonObject;
    }
    
    // Clean result.
    $jsonObject = cleanJsonString($response['curlResult']);
    
    // Print image object property.
    echo $jsonObject->image;
    

    【讨论】:

    • 我只想打印“bbbbb”或“aaaaa”
    • 所以应该打印你的 curl 请求中的每一条信息。如果您的回复 ($response['curlResult']) 看起来像您期望的对象,您应该能够json_decode 它。如果你不能,那么就出了问题,因此所有其他信息。查看返回以查看您的通话出错的地方。
    • @D Lowther 。我是初学者..我之前使用过此代码....&lt;?php $url = 'http://127.0.0.1/api.txt'; $output = file_get_contents($url); echo $output; ?&gt; 但我无法打印“aaaaa”或“bbbbb”:/
    • 我想我看到了这个问题。您的请求将返回 "info = {/*object*/}" 如果您从本地提取它并尝试模拟 JSON,则文件应该只是 {/*object} info = 部分将其变成无效的 json 字符串。如果您无法更改 api.txt 文件以使用有效对象,我可以添加一个剥离该信息部分的示例。
    • 好的先生..@D Lowther。我无法更改或删除"info" 谢谢^^
    【解决方案2】:

    取决于图像是实际的 blob 内容还是 url 链接可能会改变您显示图像的方式。

    如果是内容,您需要获取 MIME 类型才能正确显示,以便设置正确的页眉。

    如果链接,请访问该网页。

    【讨论】:

    • :) 只是一个文本(图片网址)= bbbbb
    • 那么当前的问题是什么?无法获取图片网址?或者您正在尝试使用图片网址?
    • @Paul Makhnovskiy 我无法获取图片网址 (bbbbb)
    • 而不是 echo $result->image;做:回声$obj->图像;当您解码 $results 时,您将添加到 $obj 变量中,该变量包含所有 json 内容。
    【解决方案3】:

    使用DOMDocument获取图片url

       $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_URL, 'http://www.halalfoodrecipe.com/recipe/index');
        $result = curl_exec($ch);
        curl_close($ch);
        $obj = json_decode($result);
    
        $dom = new DOMDocument;
        $dom->loadHTML($result);
    
        foreach ($dom->getElementsByTagName('img') as $img) {
            echo $img->getAttribute('src');
        }
    

    【讨论】:

    • 非常感谢您的详细解释,对不起:(但我想打印这个文本“aaaaa”或这个“bbbbb”
    【解决方案4】:

    在你的 api 中:

    1. 将整个图像内容读入字符串。 (file_get_contents)
    2. 将其编码为 base64 字符串。 (base64_encode)
    3. 将其添加到返回结果中。 (替换“图像”=“bbbbb”)

    这看起来:

    $result = array(
        "title" => "aaaaa",
        "image" => "bbbbb"
    );
    $result["image"] = file_get_contents("path/to/your/image/file");
    $result["image"] = base64_encode($result["image"]);
    $result = json_encode($result);
    header("Content-Type: application/json");
    echo $result;
    

    在你的代码中:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/api');
    $result = curl_exec($ch);
    curl_close($ch);
    $obj = json_decode($result);
    // Do it if you encoded image string
    $image_string = base64_decode($obj->image);
    // Create image from base 64 decoded string
    $image = imagecreatefromstring($image_string);
    // And save your image as desired type (png or jpeg)
    imagepng($image, "path/to/save/your/image/as/png");
    

    编辑:您是否可以提供服务器端代码。您的代码按预期工作,问题出在哪里?

    【讨论】:

    • 非常感谢您的详细解释,对不起:(但我想打印这个文本“aaaaa”或这个“bbbbb”
    猜你喜欢
    • 2015-11-17
    • 2017-11-10
    • 1970-01-01
    • 2021-12-19
    • 2012-12-05
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多