Rest 向外部api发出GET请求时出现非常奇怪/不一致的行为

Rest 向外部api发出GET请求时出现非常奇怪/不一致的行为,rest,angular,Rest,Angular,我正忙于使用youtubeInMp3 API的angular4 web应用程序。当使用API下载mp3文件时,一切都正常工作,但是它并不适用于所有视频,我不确定哪些视频会出现问题,我注意到当YouTube视频ID包含u字符时,这种情况经常发生。当我得到下面的错误。。。我知道问题不在视频上,因为它在我测试它时起作用。在将id传递给API之前,我尝试过对其进行URL编码,用-替换uu,用%20替换uu,但没有成功。你知道这里可能出了什么问题/我如何着手解决 我的错误(来自chrome开发者控制台)

我正忙于使用youtubeInMp3 API的angular4 web应用程序。当使用API下载mp3文件时,一切都正常工作,但是它并不适用于所有视频,我不确定哪些视频会出现问题,我注意到当YouTube视频ID包含u字符时,这种情况经常发生。当我得到下面的错误。。。我知道问题不在视频上,因为它在我测试它时起作用。在将id传递给API之前,我尝试过对其进行URL编码,用-替换uu,用%20替换uu,但没有成功。你知道这里可能出了什么问题/我如何着手解决

我的错误(来自chrome开发者控制台)

js:3046 Angular正在开发模式下运行。呼叫 enableProdMode()以启用生产模式

main.bundle.js:368id:t0sS60Jx51c main.bundle.js:788URL main.bundle.js:789
js:376 SyntaxError:JSON中位置处的意外标记< 0 在Object.parse()处 位于Response.Body.json(vendor.bundle.js:37736) 在MapSubscriber.project(main.bundle.js:791) 在MapSubscriber.\u next(vendor.bundle.js:22171) 在MapSubscriber.Subscriber.next(vendor.bundle.js:242) 在XMLHttpRequest.onLoad上(vendor.bundle.js:38165) 在ZoneDelegate.webpackJsonp.576.ZoneDelegate.invokeTask(polyfills.bundle.js:2496) 位于Object.onInvokeTask(vendor.bundle.js:5501) 在ZoneDelegate.webpackJsonp.576.ZoneDelegate.invokeTask(polyfills.bundle.js:2495) 位于Zone.webpackJsonp.576.Zone.runTask(polyfills.bundle.js:2263)

当我发出此请求,导致REST客户端出现错误时,我得到以下响应:

metahttp equiv=“刷新”content=“0”url=”http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=t0sS60Jx51cautostart=1n=x="

youtubeInMp3 Api响应成功请求的一个示例,控制台中记录的id是YouTube视频id:

id:bjLorSJAB70 main.bundle.js:788 url main.bundle.js:789 main.bundle.js:371 Objectlength:“199”链接: “标题: “Santo Daime EU CHAMO A CURA”原型:Object main.bundle.js:373

我的代码:

//function that passes the video id to a restService for downloading:
download(id: string) {
        console.log("id: " + id);     
            this.restService.yDownload(id)
        .subscribe(
        (res) => {
            console.log(res);
            let url = res.link;
            console.log(url);
            window.location.href = `${url}target="_blank"`;
        }, (res) => {
            console.log(res)
        });
    }

    //rest service function for getting the download link from youtubeInMp3 api
    yDownload(id: string) : Observable<any> {
    let params = [
    `format=JSON`,
    `video=https://www.youtube.com/watch?v=${id}`
    ].join('&');
    let queryUrl = `${this.Y_DOWNLOAD_URL}?${params}`;
    console.log("url");
    console.log(queryUrl);
    return this.http.get(queryUrl)
    .map((res: Response) => res.json())
    .catch((err: any) => Observable.throw(err || 'server error'));
}
//将视频id传递给restService进行下载的函数:
下载(id:string){
控制台日志(“id:+id”);
this.restService.yDownload(id)
.订阅(
(res)=>{
控制台日志(res);
让url=res.link;
console.log(url);
window.location.href=`${url}target=“\u blank”`;
},(res)=>{
console.log(res)
});
}
//rest服务函数,用于从youtubeInMp3 api获取下载链接
yDownload(id:string):可观察{
设params=[
`format=JSON`,
`录像带=https://www.youtube.com/watch?v=${id}`
].加入(“&”);
让queryUrl=`${this.Y\u DOWNLOAD\u URL}?${params}`;
控制台日志(“url”);
console.log(queryUrl);
返回此.http.get(queryUrl)
.map((res:Response)=>res.json())
.catch((err:any)=>可观察的.throw(err | |'服务器错误');
}

Unexpected token<在JSON中的位置0表示返回html页面而不是有效的JSON。这不是一个有棱角的问题。您可以通过手动发出请求来隔离问题。由于这是API错误,考虑处理他们的支持或找到一个替代方案,如果你没有达到这一点。我看不出SO在这里有什么帮助。@user2094257使用REST客户端时工作正常,因此API肯定没有问题。您发布的链接,它用html响应。我看不出这里能做些什么。好像我在他们的网站上添加了下载文本字段的链接,然后先在那里下载了之后,它就在我这边起作用了。所以我猜他们会以某种方式存储它,如果在他们第一次下载它之前它还没有被下载,那么他们就必须下载它来获得链接。。。