2017-02-24 154 views
-1

如何從api url獲取數據(圖片)?如何從API獲取數據 - php - curl

阿比結果:

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] => 
) 

回答

0

的一個好辦法,試圖調試這將是檢查捲曲信息陣列,或捲曲的錯誤。

<?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_decode功能一些非JSON字符串數據。這並不理想,但它發生了。以下方法應該有助於解決這個特定情況,但這只是解決涉及錯誤數據的問題的解決方法。

// 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; 
+0

@D Lowther,非常感謝你 – moon90

+0

只是我想打印「bbbbb」或「aaaaa」 – moon90

+0

因此,應該打印每一條信息如果你的響應('$ response ['curlResult']')看起來像你期望的對象,你應該能夠'json_decode'它,如果你不能,那麼出現了問題,所有的其他信息,看看通過返回,看看你的電話會出現錯誤。 –

0

根據影像是否有實際的BLOB內容或網址鏈接可能會改變您顯示圖像的方式。

如果是內容,您需要獲取MIME類型才能正確顯示,以便您可以設置正確的頁眉。

如果有鏈接,請訪問該網頁。

+0

:)只是一個文本(圖片URL)= bbbbb – moon90

+0

那麼目前的問題是什麼?您無法獲取圖片網址?或者您正在嘗試使用圖片網址? –

+0

@ Paul Makhnovskiy我無法獲取圖片url(bbbbb) – moon90

0

在您的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"); 

編輯:你可以提供服務器端代碼。你有預期的代碼在哪裏工作?

+0

非常感謝你的詳細解釋,請問:(但是我想打印這個文本「aaaaa」或這個「bbbbb」 – moon90

0

使用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'); 
    } 
+0

非常感謝你的詳細解釋,藉口我:(但我想打印這個文本「aaaaa」或這個「bbbbb」 – moon90