2

soundcloud的人在看这个吗?为什么我收到一个有效请求的 403?

我目前正在使用 Titanium 构建一个 iOS 应用程序。

我包含一个新功能,允许用户下载 Soundcloud .mp3 文件并从应用程序播放它们(保存到应用程序目录)

我编写的代码在某些轨道上运行良好,但不适用于其他轨道。客户端可以无限下载所有曲目,并且我已经大大增加了最大超时时间,但它仍然只下载了大约 170 字节,然后在某些曲目上失败了。在其他人身上,它可以毫无问题地下载整个曲目。真的被这个难住了,有人有什么想法吗?

下面是代码,也是一个轨道工作的例子,如果有人能看出区别,一个不工作?

谢谢

贾斯汀

//Download code


var newDir = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory,'scDownloads');

    newDir.createDirectory();

    var id = fStripped;

    var dlXhr = Titanium.Network.createHTTPClient({
        timeout : 500000});

    dlXhr.onload = function(){
        var file = Ti.Filesystem.getFile(newDir.resolve(),id +'.mp3');

        Ti.API.warn('file is: ' + file);

        file.createFile();

        file.write(this.responseData);

    }

    dlXhr.open('GET',dlURL + '?client_id=' + soundcloudClientID);

    dlXhr.send();

这里有几首曲目(带有客户 ID)

这个有效:https ://api.soundcloud.com/tracks/60943956/download?client_id=7a0984726d0eefbb310771c4c02116a8

这个没有:https ://api.soundcloud.com/tracks/63980557/download?client_id=7a0984726d0eefbb310771c4c02116a8

我已经在 Soundcloud 的 API 控制台 (http://developers.soundcloud.com/console) 上对此进行了测试,得到了以下结果:

HTTP/1.1 302 临时移动 Access-Control-Expose-Headers: Date X-Runtime: 20 Age: 0 Content-Length: 28 X-Cacheable: NO:Cache-Control=no-cache Location: gda=1351783496_b465064be1b41027a7a0bf6067d83169">http: //ak-media.soundcloud.com/kw7JNYi7HtCq?AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ&Expires=1351783496&Signature=UNtBsSfBh1XNvXPLSLNVzTQEclY%3D& gda =1351783496_b465064be1b41027a7a0bf6067d83169 Access-Control-Allow-Methods: GET, PUT, POST, DELETE Con​​nection: close Server: nginx X-Cache: MISS Cache-Control: no-cache X-Varnish: 1398398080 Access-Control-Allow-Headers: Accept, Authorization, Content-Type, Origin Date: Thu, 01 Nov 2012 15:24:36 GMT Access-Control-Allow-Origin: * 通过:1.1 varnish 内容类型:application/xml;charset=utf-8

302 - 找到

我还添加了一个 Ti.API.debug(e.error); 到我创建的 dlXhr.onerror 函数,这只是返回

4

1 回答 1

1

我得到一个“不”的403。您应该监听 onerror 事件,并适当地处理它。此外,您应该流式传输文件,而不是将其保存在内存中,而不是一次全部写出。利用 iOS 上 Ti.Network.HTTPClient 上可用的“文件”属性来简单地做到这一点。另外,显示进度,因为您正在下载一个巨大的文件。下面的示例演示了所有这些:

var win = Ti.UI.createWindow({
    backgroundColor: 'white'
});
var progressBar = Ti.UI.createProgressBar({
    max: 1, min: 0, value: 0,
    left: 20, right: 20,
    height: 20,
    visible: true
});
win.add(progressBar);
win.open();

var fileName = 'file.mp3';
var link = 'https://api.soundcloud.com/tracks/63980557/download?client_id=7a0984726d0eefbb310771c4c02116a8';
var file = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, fileName);

var client = Ti.Network.createHTTPClient({
    ondatastream: function (e) {
        progressBar.value = e.progress;
    },
    onload: function () {
        alert('Download Complete: ' + file.size);
    },
    onerror: function (e) {
        alert(client.status);
    }
});
client.open('GET', link);
client.file = file;
client.send();
于 2012-10-31T15:01:30.267 回答