2

在我的Angular2应用程序中,我从REST API获取响应并对其进行操作,以便在用户界面中显示它们。处理204- HTTP Observable中没有内容响应 - Angular2

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

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 - 我的请求没有内容回应。在这种情况下,我得到的错误

无法读取空的特性“地图”

我曾尝试到现在为止,我检查响应是否是我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]); 
     } 

    } 

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

回答

3

您可以检查服务调用的错误响应itself.Try下面的代码

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(res.statu != 200) { 
       throw new Error('This request has failed ' + res.status); } // If everything went fine, return the response 
       else { 
       return res.json(); 
       } }).catch(this.handleError); 
     } 
+0

我怎样才能做到这一点在我的服务,因为我有一个不同的代码'this._http 获得(这一点。 _endpointUrl +“tender/get-by-category-name /”+ categoryName) .map(mapTenders) .catch(handleError);' – vigamage

+0

谢谢您的回答。但你能为我的案子建议我一个解决方案吗?我正在调用外部函数来映射我收到的对象 – vigamage

+0

删除外部函数并尝试使用相同函数中的可观察对象 – Vignesh