Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deal with http status codes other than 200 in Angular 2

Right now the way I do http requests (borrowed from this answer) is this:

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() }             }         });     } 

This works fine, except for the fact that angular2 will fail if the status code returned is anything else than 200. For example, if a user wants to post something and the server returns 400, angular 2 will throw the exception:

uncaught exception: [object Object]

How can I avoid this? I'd like to handle these status codes in my app in order to enhance user experience (show errors, etc)

like image 308
Sebastian Olsen Avatar asked May 05 '16 14:05

Sebastian Olsen


People also ask

Which status code is use for too many request?

The 429 status code indicates that the user has sent too many requests in a given amount of time.

What does HTTP 200 response code specifies?

The HTTP 200 OK success status response code indicates that the request has succeeded. A 200 response is cacheable by default. The meaning of a success depends on the HTTP request method: GET : The resource has been fetched and is transmitted in the message body.

Is the HTTP status code for your website when it's down for maintenance 200?

The original definition of the 503 status code, according to this RFC, is: The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. The implication is that this is a temporary condition which will be alleviated after some delay.


1 Answers

Yes you can handle with the catch operator like this and show alert as you want but firstly you have to import Rxjs for the same like this way

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));                 }             });     } 

also you can handel error (with err block) that is throw by catch block while .map function,

like this -

... .subscribe(res=>{....}            err => {//handel here}); 

Update

as required for any status without checking particluar one you can try this: -

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)} ); 
like image 199
Pardeep Jain Avatar answered Oct 07 '22 21:10

Pardeep Jain