getDecodedBody() 不解析对象(原始图形 API 响应)正确

getDecodedBody() not parsing object(raw Graph API response) right

我遇到了 Graph API response 的奇怪问题。我有以下呼叫 Graph API:

try{
    $appName=$fb->get('/'.$apid, $apid.'|'.$apsec);
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    //echo 'Graph returned an error: ' . $e->getMessage();
    //echo 'Graph returned an error: ' . $e->getHttpStatusCode();
    if($e->getHttpStatusCode()=='400'){
    echo json_encode('2');
    }
    exit;
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
    }
    $appName=$appName->getDecodedBody();//app data returned as array

这很好用,我得到 array 形式 object 并且我可以随意使用它。现在问题来了。我 运行 几乎与上面相同的代码,只是想检索 app's icon:

url
try{
    $appPic=$fb->get('/'.$apid.'/picture', $apid.'|'.$apsec);
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    echo 'Graph returned an error: ' . $e->getMessage();
    echo 'Graph returned an error: ' . $e->getHttpStatusCode();
    if($e->getHttpStatusCode()=='400'){
    echo json_encode('2');
    }
    exit;
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
    }
    $appPic=$appPic->getDecodedBody();
    print_r($appPic);

这个returns一个空数组。但是如果 运行 Graph API Explorer 中的相同代码,我会得到这样的响应:

我觉得这很奇怪,我不明白为什么会这样。请帮忙,我真的需要 array 形式的 url

更新: 我仔细查看了 Inspect 工具的 Network 部分,这两个调用似乎有所不同。在这里你可以看到如何:

似乎第一次调用 Graph API 使用 Facebook/FacebookResponse class 和第二个 Facebook/FacebookRequest。我一找到这个就打开文档,看到Facebook/FacebookRequest里面没有getDecodedBody()这样的方法。但是当我从上面的代码 var_dump($appPic) 时,我确实得到了一个 array 但是空的(当然,在执行 getDecodedBody() 之后)。

更新 我也试过这个:

$url="https://graph.facebook.com/$apid/picture";
$app_icon = file_get_contents($url);
var_dump($app_icon);

Returnsbool(false)。当我在浏览器中输入相同的 url 时(当然,我输入的是真实的应用程序 ID,而不是变量),它会显示应用程序图标。似乎 Facebook 不允许 file_get_contents 从他们的服务器获取数据的方式。我也尝试用 cURL 做同样的事情,像这样:

$url="https://graph.facebook.com/$apid/picture";

$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, false);

$result=curl_exec($ch);
if(!$result){
echo ('cURL ERROR: '.curl_error($ch));
}
var_dump($result);
curl_close($ch);

但是我var_dump($result);的时候returnsbool(true)但是没有图片,也没有url导致app图片。

您对调试信息的解释不正确。 FacebookResponse 是一个 class 包装你从 FB 收到的响应作为你的请求的答案,你的请求被打包在 FacebookRequest 实例中。

所以 FacebookRequest(可能)是您的第一个调用,而 FacebookResponse 只是对它的响应。

我找到了一种方法来检索 url 到应用程序图标,这很有趣。如果你仔细观察 Inspect 给我的图像,你会发现 Decoded Body 真的是一个空数组,天知道为什么。但是对象的 Headers 部分确实有 Location 即通向应用程序图标的 url。因此,我没有使用 getDecodedBody() 方法,而是使用了 getHeaders() 并获得了具有 Locations 键值的数组。