AliReza
AliReza

Reputation: 776

POSTing json to API with Angular 2/4

I am new to angular 4 and REST API development. I have developed a Login API in back-end and it works fine when I call it using Postman:

enter image description here

In the front-end application which is an Angular 4 project, I have created a service to call this login API. Here is the method I created in this service:

sendCredential(username: string, password: string) {
    const url = 'http://localhost:8080/authenticate/user';
    const body = '{"username": "' + username + '", "password": "' + password + '"}';
    const headers = new Headers(
        {
            'Content-Type': 'application/json'
        });
    return this.http.post(url, body, {headers: headers});
}

My first question is: Is this the correct way to pass the json object and call this API?

And I also created a component which calls the method in the service. Here is the method/event-handler I created in this component:

onSubmit(uname: string, pwd: string) {
    this.loginService.sendCredential(uname, pwd).subscribe(
        res => {
            this.loggedIn = true;
            localStorage.setItem('PortalAdminHasLoggedIn', 'true');
            location.reload();
        },
        err => console.log(err)
    );
}

My second question is: How should I check whether a token is returned back or an error?

Upvotes: 2

Views: 11491

Answers (1)

CozyAzure
CozyAzure

Reputation: 8478

Question 1:

You do not need to stringify the body object when you do a http.post() in angular. Just use a normal object will do, and the Http class will help you parse it internally:

sendCredential(username: string, password: string) {
    const url = 'http://localhost:8080/authenticate/user';
    //do not need to stringify your body
    const body = {
        username, password
    }
    const headers = new Headers(
        {
            'Content-Type': 'application/json'
        });
    return this.http.post(url, body, {headers: headers});
}

Question 2:

As for your error, note that Angular also catch every http error. and by http error, it means that any status code that is <200 or >=300 will be an error. So only status codes that is in between 200 and 300 is considered successful. Upon an error received, angular will throw an Observable error, which you will need to handle explicitly (which you did it correctly):

onSubmit(uname: string, pwd: string) {
    this.loginService.sendCredential(uname, pwd).subscribe(
        res => {
            //token should be in your res object
            this.loggedIn = true;
            localStorage.setItem('PortalAdminHasLoggedIn', 'true');
            location.reload();
        },
        err => {
            //handle your error here.
            //there shouldn't be any token here
            console.log(error);
        }
    );
}

With your above code, you should receive your token in your successful callback, and it will be in the res object. If there's an error, no token should be received and you should handle the error at the error callback.

Upvotes: 1

Related Questions