Angular 2,可以Http.get忽略404

时间:2016-08-19 09:09:50

标签: angular

我需要使用HTTP库来检查服务器上是否存在文件。它非常简单,我所做的就是调用以下代码:

private serverHeadRequest(): Observable<any> {
        return this.http.head("theFileName.xxx")
            .map(this.isResponseOkCallBack)
            .catch(this.handleError);
    }

    private isResponseOkCallBack(res: Response) {
        switch (res.status) {
            case 404:
                return false;
            case 200:
                return true;
            default:
                return false;
        }
    }


    private handleError(error: any) {
        let errMsg = (error.message) ? error.message :
            error.status ? `${error.status} - ${error.statusText}` : 'Server error';
        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
    }

如果响应是200,则代码运行良好。但是,我想简单地在任何其他类型的响应代码上返回false。

我尝试将此作为替代错误处理程序,如果出现错误,我认为只会返回false,但这并不起作用。

private handleError(error: any) {
        return Observable.create()
             .map({
                 return false;
              });
    }

我怎样才能使这个工作?有没有办法忽略某些状态代码?

非常感谢

JT

3 个答案:

答案 0 :(得分:4)

尝试认为你可以像这样处理错误:

// import 'rxjs/add/observable/of'

handleError() {
  return Observable.of(false);
}

另请注意,如果出现错误,浏览器仍会在控制台中打印HEAD <url> 404 (Not Found)。你不应该担心这一点,最重要的是你正确处理它(但返回false)。

答案 1 :(得分:1)

如果出现错误(大多数非2xx响应都会抛出),则isResponseOkCallBack不会被调用,因为它会直接跳转到.catch()块。

尝试将所有成功请求映射为true,将任何错误映射为false。

this.http.head("theFileName.xxx")
            .map(() => true) // or .map(res => (res.status === 200)) 
            .catch(() => Observable.of(false));

答案 2 :(得分:0)

这就是我最终做的事情:

serverHeadRequest(): Observable<any> {
        return this.http.head('someFileName.xxx')
            .map(this.isResponseOkCallBack)
            .catch(this.handleHEADError);
    }

private isResponseOkCallBack(res: Response) {
        switch (res.status) {
            case 404:
                return false;
            case 200:
                return true;
            default:
                return false;
        }
    }

private handleHEADError(error: any) {
        return Observable.of(this.isResponseOkCallBack);
    }

非常感谢你的帮助。我很感激。

JT