Json 如何在Angular 5中处理http响应中的两个可能对象
我在angular 5中发送了一个http:post方法,希望获得一些数据,但是如果出现错误,服务器将向我发送一个不同的数据结构。我是说,一个不同的物体。 我创建了两个类,一个用于正确响应,另一个用于错误响应 也许它是一个可观察的。我很困惑 登录后,我得到以下信息: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
{
"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错误代码+错误消息。错误消息可以位于错误对象的结构中。