使用PHP API为私有轨道渲染SoundCloud小部件

时间:2012-10-08 10:13:50

标签: php api soundcloud http-status-code-302

我正在尝试使用PHP API呈现SoundCloud HTML5小部件,但每次运行该命令时,我认为应该返回小部件的HTML,我只是得到一个异常:

The requested URL responded with HTTP code 302

我意识到这是一个重定向。我不知道的是为什么我会得到这些,或者为了实际获取小部件HTML该怎么做。

关于API的文档说要使用PHP嵌入小部件,你应该这样做:

<?php
    require_once 'Services/Soundcloud.php';

    // create a client object with your app credentials
    $client = new Services_Soundcloud('YOUR_CLIENT_ID', 'YOUR_CLIENT_SECRET');

    // get a tracks oembed data
    $track_url = 'http://soundcloud.com/forss/flickermood';
    $embed_info = $client->get('/oembed', array('url' => $track_url));

    // render the html for the player widget
    print $embed_info['html'];

我正在运行:

// NB: Fully authorised SoundCloud API instance all working prior to this line
// $this->api refers to an authorised instance of Services_Soundcloud

try {   
        $widget = array_pop(
            json_decode( $this->api->get('oembed', array('url' => $track_url)) )
        );

        print_r($widget);

    } catch (Exception $e)
    {
        print_r($e->getMessage());
    }

其中“track_url”实际上是我在应用程序中使用相同的API在应用程序中向SoundCloud请求轨道对象时返回的URL。

我实际上并不确定这个网址是否正确,因为我回来的跟踪对象在表单中给出了'uri':

[uri] => https://api.soundcloud.com/tracks/62556508

文档示例都有一个直接的http://soundcloud.com/username/track-permalink网址 - 但即使使用已知的公共路径路径,运行API oembed方法的尝试也会失败...我仍然会遇到302异常。

最后,提到在'get'命令中将“allow_redirects”设置为false,但是当我添加用于构建API的查询的参数时,这没有任何效果。我也尝试添加额外的cURL选项,但这也没有效果。

我确实在SoundCloud中启用了对该轨道的API访问。

有点把我的头撞到墙上。如果有人有任何指示我会非常感激听到他们。为了清楚起见,我可以通过我创建的API实例访问所有用户数据,注释等,因此它似乎工作正常。

1 个答案:

答案 0 :(得分:2)

感谢您指出这一点。文档中有一个错误导致您误入歧途。对于那个很抱歉。我已经更新了文档来修复bug。这是更新的代码示例:

<?php

require_once 'Services/Soundcloud.php';

// create a client object with your app credentials
$client = new Services_Soundcloud('YOUR_CLIENT_ID', 'YOUR_CLIENT_SECRET');
$client->setCurlOptions(array(CURLOPT_FOLLOWLOCATION => 1));

// get a tracks oembed data
$track_url = 'http://soundcloud.com/forss/flickermood';
$embed_info = json_decode($client->get('oembed', array('url' => $track_url)));

// render the html for the player widget
print $embed_info->html;

请注意差异:

  • 您需要将CURLOPT_FOLLOWLOCATION设置为1,如上面的评论中所述。
  • 您需要将$client->get的回复换自json_decode
  • 结果是stdClass对象,而不是Array,因此必须使用html运算符访问->属性。

希望有所帮助。如果您仍然遇到问题,请随时发表评论,我会修改我的答案。