Angular 7处理HTTP请求

Pri*_*riz 0 angular

我在获取一个简单的http调用上班时遇到问题。

我来自angularjs和AFAIK .then=.subscribe

所以这是我的问题,我可以.subscribe在我的auth-service中不使用,而是在我的login.component.ts中使用它,我也想获取Http Status

认证服务

const httpOptions = {
   headers: new HttpHeaders({
       'Content-Type': 'application/json'
    })
}

export class AuthService {
 constructor(private http: HttpClient) { }
 mainUrl = 'http://localhost:4000/api/v1';
 signIn(user: User) { // this is working fine, BUT I want to use .subscribe in login component
    const url = `${this.mainUrl}/sign_in`;
    return this.http.post<any>(url, user, httpOptions)
    .subscribe(
    (data) => {
      console.log(data); // I want to get the 200 status not only the jwt token
      return data;
    },
    (error) => console.log(error)
  )
 }
}
Run Code Online (Sandbox Code Playgroud)

login.component.ts

this.authService.signIn(userData); // how to use .subscribe here ? 
Run Code Online (Sandbox Code Playgroud)

更新:

这是我的angularjs代码的样子。

认证服务

function signIn(data) {
        return $http.post(url + '/api/v1/sign_in_2', data)
            .then(success)
            .catch(fail);

        function success(response) {
            setToken(response.data.jwt);
            return response;
        }

        function fail(e) {
            return e;
        }
    }
Run Code Online (Sandbox Code Playgroud)

login.ctrl

vm.doLogin = function (userData) {
  vm.spinner = true;
  elixirAuthServices.signIn(userData).then(function (data) {

    if (data.status === 200 || data.status === 201) {
      elixirAuthServices.getUser().then(function (data) {
        vm.user_id = data.data.id;
        redirect();
      });
    } else {
      vm.authenticateErr = true;
      vm.spinner = false;
      logger.info('Username or Password is incorrect');
    }

  });
};
Run Code Online (Sandbox Code Playgroud)

wen*_*jun 5

您很接近,但是您应该对service.ts进行以下修改。如果您打算使用它们,请不要忘记导入所需的RxJS运算符,例如管道和地图。

import { catchError, map, tap } from 'rxjs/operators';

signIn(user: User) {
  const url = `${this.mainUrl}/sign_in`;
  return this.http.post<any>(url, user, httpOptions).pipe(
    // additional operations before returning observable
    //map(data => ....), 
    //catchError(this.handleError('signIn', []))
  );
 }
Run Code Online (Sandbox Code Playgroud)

在您的component.ts上,您可以通过订阅来返回它。该认购方法处理回调nexterrorcomplete

this.authService.signIn(userData).subscribe(success => {
   // next
   // .. handle successful response (status code 200)
}, error => {
   // handle errors
   console.log(error.status)
}, () => {
   // complete 
})
Run Code Online (Sandbox Code Playgroud)

编辑:如果要阅读完整的响应正文,可以使用该observe选项

this.http.post<any>(url, user, { observe: 'response' }).pipe(
    //additional operations before returning observable
    //tap(response => console.log(response.status)
    //map(response => response.body), 
    //catchError(this.handleError('signIn', []))
  );
Run Code Online (Sandbox Code Playgroud)