Json 如何在Angular 5中处理http响应中的两个可能对象

Json 如何在Angular 5中处理http响应中的两个可能对象,json,angular,http,observable,Json,Angular,Http,Observable,我在angular 5中发送了一个http:post方法,希望获得一些数据,但是如果出现错误,服务器将向我发送一个不同的数据结构。我是说,一个不同的物体。 我创建了两个类,一个用于正确响应,另一个用于错误响应 也许它是一个可观察的。我很困惑 登录后,我得到以下信息: { "token_type": "Bearer", "expires_in": 299, "access_token": "da7a2180c2883ff8dasdsadsc84", "refresh

我在angular 5中发送了一个http:post方法,希望获得一些数据,但是如果出现错误,服务器将向我发送一个不同的数据结构。我是说,一个不同的物体。 我创建了两个类,一个用于正确响应,另一个用于错误响应

也许它是一个可观察的。我很困惑

登录后,我得到以下信息:

{
    "token_type": "Bearer",
    "expires_in": 299,
    "access_token": "da7a2180c2883ff8dasdsadsc84",
    "refresh_token": "def502000396e1de7a2180c2883ff8c84"
}
{ 
    "error": "invalid_grant",
    "message": "a long message that nobody reads... ",
    "hint": "Check the configuration to see if the grant is enabled."
}
但如果我的请求失败,我会得到:

{
    "token_type": "Bearer",
    "expires_in": 299,
    "access_token": "da7a2180c2883ff8dasdsadsc84",
    "refresh_token": "def502000396e1de7a2180c2883ff8c84"
}
{ 
    "error": "invalid_grant",
    "message": "a long message that nobody reads... ",
    "hint": "Check the configuration to see if the grant is enabled."
}
将获得响应的类是:

export class token {
        token_type: string;
        expires_in: number;
        access_token: string;
        refresh_token: string;
    }
获取失败响应的类是:

export class error
    {
        error: string;
        message: string;
        hint: string;
    }
这是http.post:

  login (token: Token): Observable<Token> {
      const url = `${this.mainUrl}user/login?_format=json`;  
      const loginReturn = this.http.post(url, token);     
      console.log (loginReturn);    

      return loginReturn 
      .map((token: Token) => 
        {
            if (token && token.access_token){
                // store user details and jwt token in local storage to keep user logged in between page refreshes
                 localStorage.setItem('token', JSON.stringify(token.access_token));
            }
        // console.log ('localstorage ' + localStorage['token']);
        return token;
       })   
  }
您可以犯一个-Token错误,这意味着您的返回类型是可观察的或可观察的

您可以犯一个-Token错误,这意味着您的返回类型是可观察的或可观察的


您的const loginReturn是response类型,在您拥有的对象上

对于良好调用,布尔ok为true;对于错误调用,如400,布尔ok为false 或包含服务器的HttpStatusCode的字段状态 因此,当ok==true时,您应该执行映射代码,当bool为false时,您可以执行一些通用的错误处理

甚至在您的令牌/错误周围包装一个父对象,包含相同的bool,这样您就可以在调用此服务的组件中处理错误,并返回该错误并在那里进行一些处理

export class response {
  token: token,
  error: error,
  ok: boolean
}

您的const loginReturn是response类型,在您拥有的对象上

对于良好调用,布尔ok为true;对于错误调用,如400,布尔ok为false 或包含服务器的HttpStatusCode的字段状态 因此,当ok==true时,您应该执行映射代码,当bool为false时,您可以执行一些通用的错误处理

甚至在您的令牌/错误周围包装一个父对象,包含相同的bool,这样您就可以在调用此服务的组件中处理错误,并返回该错误并在那里进行一些处理

export class response {
  token: token,
  error: error,
  ok: boolean
}
您应该在请求中附加.catch

login (token: Token): Observable<Token> {
    ...
    return loginReturn 
        .map((token: Token) => ..)
        .catch((error) => throw Observable.throw(err))
}
您应该在请求中附加.catch

login (token: Token): Observable<Token> {
    ...
    return loginReturn 
        .map((token: Token) => ..)
        .catch((error) => throw Observable.throw(err))
}

在这两种情况下,您是否都收到HttpStatusCode 200?这将是奇怪的,因为200是成功的,4xx或5xx用于erro handlingGood point@benchroughs,在好的场景中,我收到一个200 Ok,在错误的场景中收到一个400错误的请求。那么你的代码是好的,除了它不尊重命名约定。有什么问题吗?我想使用来自@JBNizetYou响应的数据。如果要处理错误,请使用catch或subscribe并传递错误回调。在这两种情况下,如果服务器确实发送了一个错误,那么您将得到一个错误作为参数。在这两种情况下,您是否都收到HttpStatusCode 200?这将是奇怪的,因为200是成功的,4xx或5xx用于erro handlingGood point@benchroughs,在好的场景中,我收到一个200 Ok,在错误的场景中收到一个400错误的请求。那么你的代码是好的,除了它不尊重命名约定。有什么问题吗?我想使用来自@JBNizetYou响应的数据。如果要处理错误,请使用catch或subscribe并传递错误回调。在这两种情况下,如果服务器确实发送了一个错误,您将得到一个错误作为参数。但这意味着不使用error类?只有400个错误的请求响应?您的后端应该返回http错误代码+错误消息。错误消息可以在错误对象的结构中。但这意味着不使用错误类?只有400个错误的请求响应?您的后端应该返回http错误代码+错误消息。错误消息可以位于错误对象的结构中。