今2

2016-05-05 4 views
20

角度で200以外のHTTPステータスコードと私のやり方を対処する方法をHTTP(this answerから借用)の要求はこれです:今2

POST(url, data) { 
     var headers = new Headers(), authtoken = localStorage.getItem('authtoken'); 
     headers.append("Content-Type", 'application/json'); 

     if (authtoken) { 
     headers.append("Authorization", 'Token ' + authtoken) 
     } 
     headers.append("Accept", 'application/json'); 

     var requestoptions = new RequestOptions({ 
      method: RequestMethod.Post, 
      url: this.apiURL + url, 
      headers: headers, 
      body: JSON.stringify(data) 
     }) 

     return this.http.request(new Request(requestoptions)) 
     .map((res: Response) => { 
      if (res) { 
       return { status: res.status, json: res.json() } 
      } 
     }); 
    } 

これは事実そのangular2意志を除いて、正常に動作します

キャッチされない例外:[オブジェクトのオブジェクト]

返されたステータスコードは、例えば200よりも何か他のものは、ユーザーが何かを掲示したいと、サーバーが400を返す場合、角2は、例外がスローされます、ある場合には失敗

どうすればこの問題を回避できますか?私のアプリでこれらのステータスコードを処理して、ユーザーエクスペリエンスを向上させる(エラーの表示など)

答えて

41

はい、このようなキャッチ演算子で処理し、必要に応じて警告を表示できますが、まずインポートする必要がありますcatchブロックによって投げがある。この方法も

import {Observable} from 'rxjs/Rx'; 

return this.http.request(new Request(this.requestoptions)) 
      .map((res: Response) => { 
       if (res) { 
        if (res.status === 201) { 
         return [{ status: res.status, json: res }] 
        } 
        else if (res.status === 200) { 
         return [{ status: res.status, json: res }] 
        } 
       } 
      }).catch((error: any) => { 
       if (error.status === 500) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 400) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 409) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 406) { 
        return Observable.throw(new Error(error.status)); 
       } 
      }); 
    } 

あなたは(ERRブロックで)エラーをヘンデルできるように同じのためRxjsしばらく.map機能、このような

-

... 
.subscribe(res=>{....} 
      err => {//handel here}); 
あなたはこれを試すことができ

更新

particluar 1をチェックせずに任意の状態のために必要とされる: -

return this.http.request(new Request(this.requestoptions)) 
      .map((res: Response) => { 
       if (res) { 
        if (res.status === 201) { 
         return [{ status: res.status, json: res }] 
        } 
        else if (res.status === 200) { 
         return [{ status: res.status, json: res }] 
        } 
       } 
      }).catch((error: any) => { 
       if (error.status < 400 || error.status ===500) { 
        return Observable.throw(new Error(error.status)); 
       } 
      }) 
      .subscribe(res => {...}, 
         err => {console.log(err)}); 
+0

それは条件として、すべてのステータスコードを記述する必要がないようにすることは可能ですか?状態を返すだけで、私のコンポーネントはそれらの状態コードで何をすべきかを判断することができます。 –

+0

はい、エラーブロックをどのようにハンドリングするかによって、状況をチェックせずにエラーを返すことができます。 –

+0

それを編集できますか?あなたの既存の例でそれをしようとするのは苦労します。 –