Можно ли использовать код ответа 500 для нормального потока приложений?Разработка всплывающих сообщений с Angular7 + Spring - PullRequest
0 голосов
/ 29 декабря 2018

С точки зрения Java, использование Исключений для обработки ОЖИДАЕМЫХ результатов неверно (Исключения должны быть такими, как они называются).

Для всех моих сервисов я создал механизм-обертку, который в основном дает подробности о сбое, если такое происходит (все возвраты произвольны Result<?>).Теперь мне нужно отобразить это сообщение в браузере клиента в каком-то всплывающем окне.

С Angular есть HttpClient, который фактически поддерживает перехват ошибок HTTP-ответа: https://angular.io/guide/http#error-handling

Является ли это приемлемым способом сообщения об ошибкеот сервера к клиенту?

Есть ли в Angular способ определить экстрактор, который бы разделял ответы от внутреннего API?

Скажем, я бы сделал все тела возврата REST API:

{
    messageType: "", // Success, Failure, Warning
    message: "Message",
    content: {
        ...
    }
}

И таким образом я мог бы раздеть message, messageType в перехватчике, отобразить их во всплывающем окне и передать только content дальше как тело?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Поскольку я пришел в веб из чистых бэкэндов Java - исключения в JAVA плохие (вообще говоря), зачем следовать тем же плохим практикам (используя ошибки в качестве информации) при использовании HTTP?После некоторого прочтения я могу сказать - нет, если только это на самом деле не ошибка, например:

  • 404, если клиент пытается получить доступ к объекту с идентификатором, которого там нет.
  • 500, когдаСервер В действительности не может обработать что-либо (фактическое исключение).

Вот угловая часть для моей Result<?> системы.

Перехватчик:

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:

import { Injectable } from '@angular/core';

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

app.module:

providers: [
        { provide: HTTP_INTERCEPTORS, useClass: PopupInterceptor, multi: true }
    ],
0 голосов
/ 30 декабря 2018

Хороший способ перехватить все исключения на стороне службы с помощью @ControllerAdvice и выдать специфичные для пользователя / функции исключения с ожидаемым сообщением об исключении и кодом состояния в стандартной структуре, чтобы у внешнего интерфейса мог быть контроллер исключений для оценки этого сообщения об исключениимуха во всплывающем сообщении, динамическом для любого сообщения от сервиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...