首页 文章

处理204- HTTP Observable中没有内容响应 - Angular2

提问于
浏览
4

在我的Angular2应用程序中,我从REST API获取响应并对其进行操作,以便在用户界面中显示它们 .

我根据以下教程编写了我的应用程序 .

https://www.barbarianmeetscoding.com/blog/2016/04/02/getting-started-with-angular-2-step-by-step-6-consuming-real-data-with-http/

这是我从服务器获取响应的方法

getTendersByCategory(categoryName: string){

        console.log("get tenders by category "+categoryName);

        let tendersByCategory = this._http
            .get(this._endpointUrl + "tender/get-by-category-name/" + categoryName)
            .map(mapTenders)
            .catch(handleError);

        return tendersByCategory;

}

以下函数用于操作响应

function mapTenders(response: Response): Tender[] {
    console.log('tender.service.ts -> mapTenders');

    /*if(response.status == 204){
        console.log("response = 204 - No content in response");
        return null;
    }*/

    return response.json().map(toTender);
}


function toTender(r: any): Tender {
    console.log('tender.service.ts -> toTender');
    let tender = <Tender>({
        id: r.id,
        name: r.name,
        publisher: r.publisher,
    });
    return tender;
}

function handleError(error: any) {
    console.error(error.message);
    return Observable.throw(error.message);
}

现在的问题是,我得到204 - 我的请求没有内容回复 . 在那些情况下,我得到了错误

无法读取null的属性“map”

我到目前为止所做的是,检查我的 mapTenders 函数中的响应是否为204;如果是这样我返回null而不继续映射到我的对象 . (这部分代码已在给定代码中注释掉)

这是处理此回复的正确方法吗?

但在那种情况下,即使我摆脱了错误,在我的 .component.ts 文件中我也没有得到一个空的招标清单 . 它显示所有投标没有任何过滤 . (这可能是刷新整个页面的结果,但显然,页面不会重新加载 . )

这是我的component.ts文件中的方法 .

getTendersByCategory(categoryName: string){

        this._tendersService.getTendersByCategory(categoryName).
            subscribe(

            tenders => this._tenders = tenders,
            error => this._error_tender = error

            );

       console.log("tenders.component.ts.getTendersByCategory -> tenders array = "+this._tenders.length);

       //for debugging purpose
       //this prints all the tenders. What I wished to see is nothing getting printed
       for(let i=0; i< this._tenders.length;i++){
           printTender(this._tenders[i]);
       }

    }

我能在这做什么?使用observable时如何处理204响应?

1 回答

  • 4

    您可以在服务调用本身中检查错误响应 . 请尝试以下代码

    MethodName(searchLetter: string, gender: string): Observable<Object[]> {
                let dataUrl = 'this._endpointUrl/tender/get-by-category-name/';
                let params = new URLSearchParams;
                params.append('categoryName', categoryName);
                let headers = new Headers();
    
                return this.http.get(dataUrl, { headers: headers, search: params })
                    .map(response =>  { 
                    // If request fails, throw an Error that will be caught 
                    if(response.status != 200) { 
                    throw new Error('This request has failed ' + res.status); } // If everything went fine, return the response 
                    else {
                     return response.json(); 
                    } }).catch(this.handleError);
            }
    

相关问题