首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正常应用程序流使用500响应代码可行吗?用Angular7+Spring设计弹出消息

正常应用程序流使用500响应代码可行吗?用Angular7+Spring设计弹出消息
EN

Stack Overflow用户
提问于 2018-12-29 18:42:34
回答 2查看 29关注 0票数 1

从Java的角度来看,使用异常来处理预期的结果是错误的(异常应该被称为异常)。

对于我的所有服务,我创建了包装器机制,它基本上给出了失败的细节,如果发生这种情况(所有返回都是任意的Result<?>)。现在,我需要在某些弹出窗口中在客户端浏览器上显示这条消息。

HttpClient实际上支持捕获http响应错误:https://angular.io/guide/http#error-handling

这是从服务器到客户端报告错误的可行方法吗?

是否有一种角度的方法来定义一些从后端API中分离响应的提取器?

假设我会让我的REST返回主体:

代码语言:javascript
运行
复制
{
    messageType: "", // Success, Failure, Warning
    message: "Message",
    content: {
        ...
    }
}

这样,我就可以在拦截器中剥离message, messageType,在弹出窗口中显示它们,并且只将content进一步作为主体传递?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-30 03:43:47

既然我是从纯Java后端进入web的-- JAVA中的异常是不好的(一般来说),那么为什么在使用HTTP时遵循同样的错误实践(使用错误作为信息)?再读几遍之后,我可以说-除非这实际上是个错误,例如:

  • 404如果客户端尝试使用ID访问实体,则该实体不存在。
  • 500当服务器实际上无法处理某些事情时(实际异常)。

这是我的Result<?>系统的角部分。

拦截器:

代码语言:javascript
运行
复制
import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

import { Globals } from '../globals.service';

@Injectable()
export class PopupInterceptor implements HttpInterceptor {

    constructor(private globals: Globals) { }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        if (req.url.startsWith(this.globals.apiHost)) {
            return next.handle(req)
                .pipe(
                    map(e => {
                        if (e instanceof HttpResponse) {
                            const response = <Response>e.body;
                            // use response to do whatever - I am injecting popup service and pushing response.message there for display in component.
                            return e.clone({ body: response.result });
                        }
                    })
                );
        }
        return next.handle(req);
    }
}

interface Response {
    type: string;
    message: string;
    result: any;
}

globals.service:

代码语言:javascript
运行
复制
import { Injectable } from '@angular/core';

@Injectable({
    providedIn: 'root'
})
export class Globals {
    apiHost = '/api/';
}

app.module:

代码语言:javascript
运行
复制
providers: [
        { provide: HTTP_INTERCEPTORS, useClass: PopupInterceptor, multi: true }
    ],
票数 0
EN

Stack Overflow用户

发布于 2018-12-29 21:37:25

一种使用@ControllerAdvice在服务端捕获所有异常的好方法,并将特定于用户/特性的异常与预期的异常消息和标准结构中的状态代码一起抛出,这样前端就可以有一个异常控制器来动态地在弹出消息中对来自服务的任何消息评估该异常消息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53972370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档