2017-02-24 14 views
-1

api urlからデータ(画像)を取得するにはどうすればよいですか?APIからデータを取得する方法 - php-curl

のAPI結果:

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

のAPI URL:

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); 
?> 

あなたが成功した接続を作っているし、その後もあなたはあなたにそれを解析処理する方法の良いアイデアを与える必要がありますバック応答で取得している場合は正確に何を見て。

EDIT

作業から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

画像は、実際のブロブのコンテンツやURLリンクである場合に応じて、画像を表示する方法が変わることがあります。

コンテンツの場合、適切なページヘッダーを設定できるように正しく表示するには、MIMEタイプを取得する必要があります。

リンクの場合は、そのウェブページをご覧ください。あなたのAPIで

+0

:)テキスト(画像URL)= bbbbb – moon90

+0

それでは、現在の問題は何ですか?画像のURLを取得できません。または、イメージURLを使用しようとしていますか? –

+0

@ Paul Makhnovskiy私はecho $ result-> imageの代わりに画像URL(bbbbb) – moon90

0

  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"); 

EDIT:あなたは、サーバー側のコードを提供することができますが。問題がどこにあるのか期待どおりのコードがありますか?

+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

関連する問題