【问题标题】:Response code for success not being handled in angular未以角度处理成功的响应代码
【发布时间】:2019-04-25 10:44:45
【问题描述】:

我正在尝试处理由 asp.net web api 应用程序抛出的错误代码。它工作正常,然后记录存在并抛出错误代码 409,但在成功的情况下抛出响应代码 200 时不起作用。在成功的情况下,调试点永远不会命中 catch 块,并且 save 方法中的结果对象为 null,因此不会在 if (result) 块内运行。如何显示成功消息。以前我的 asp.net web api 返回 IHttpActionResult 并在成功的情况下执行 if (result) 块。

Asp.net 网络接口

[HttpPost]
        [SkipTokenAuthorization]
        [Route("api/classificationoverrides/create")]
        public HttpResponseMessage Create(ClassificationItemViewModelCreate model)
        {
            HttpResponseMessage response;

            var mgrClassificationService = GetService<MGR_STRT_CLASSIFICATION>();

            var isExists = mgrClassificationService.Where(x =>
                x.MANAGERSTRATEGYID == model.ManagerStrategyId && x.PRODUCT_ID == model.ProductId).FirstOrDefault();

            if (isExists == null)
            {
               var mgrClassficationOverride = new MGR_STRT_CLASSIFICATION();
                if (model != null)
                {
                    mgrClassficationOverride.PRODUCT_ID = model.ProductId;
                    mgrClassficationOverride.LEGACY_STRATEGY_ID = model.LegacyStrategyId;
                    mgrClassficationOverride.STRATEGY_ID = model.StrategyId;
                    mgrClassficationOverride.MANAGERSTRATEGY_TYPE_ID = model.ManagerStrategyTypeId;
                    mgrClassficationOverride.MANAGERSTRATEGYID = model.ManagerStrategyId;

                    mgrClassficationOverride = mgrClassificationService.Create(mgrClassficationOverride);
                }
                response = Request.CreateResponse(HttpStatusCode.OK);
            }
            else
            {
                 response = Request.CreateResponse(HttpStatusCode.Conflict, "The item already exists");
            }

            return response;
        }

角度

Save() {

        if (this.ClassificationOverrideDetails.ClassificationEntities.ID === 0) {
            this.Error = '';
            this.classificationOverrideService
                .createClassificationOverrideDetails(this.ClassificationOverrideDetails.ClassificationEntities)
                .then((result) => {
                    if (result) {
                        this.ClassficationOverrideDetailsEvent.next('init');
                        this.notify.success('Classification Overrides Successfully Created');
                    }
                }).catch(err => {
                    if (err.status === 200) {
                        this.notify.error('Classification Overrides Successfully Created');
                    } else if (err.status !== 409) {
                        this.notify.error('An Error Has Occured While Updating Classification Overrides Details');
                    } else if (err.status === 409) {
                        this.notify.error('Product already exists for this Manager Strategy');
                    }
                });
        } 

服务

import { defer as observableDefer } from 'rxjs';
import { refCount, publishReplay } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { Response, URLSearchParams, RequestOptionsArgs, Headers, RequestOptions, ResponseContentType } from '@angular/http';
import { AppConfig } from '../app.config';
import { Observable } from 'rxjs/Rx';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Manager360CommonService } from './mgr360.common.service';
import { IClassificationOverride } from '../classification-overrides/classification-override.interface';


@Injectable()
export class ClassificationOverrideService {

        constructor(
                private mgr360CommonService: Manager360CommonService
        ) { }


        getClassificationOverrideDetails(mgrStrategyId: number) {
                return this.mgr360CommonService.httpGet('/api/classificationoverrides/Details/' + mgrStrategyId);
              }

        getClassificationDetails(Id: number) {
                return this.mgr360CommonService.httpGet('/api/classificationoverrides/classificationdetails/' + Id);
              }


        updateClassificationOverrideDetails(classificationOverride: IClassificationOverride) {
                return this.mgr360CommonService.httpPut('/api/classificationoverrides/update', JSON.stringify(classificationOverride));
            }

        createClassificationOverrideDetails(classificationOverride: IClassificationOverride) {
               return this.mgr360CommonService.httpPostAsync('/api/classificationoverrides/create', JSON.stringify(classificationOverride));
            }

        deleteClassificationOverrideDetails(Id: number) {
                return this.mgr360CommonService.httpDelete('/api/classificationoverrides/delete/' + Id);
             }

}

公共服务

   import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { RequestOptions } from '@angular/http';
import { Options } from 'selenium-webdriver/firefox';
import { NotifyService } from '../utilities/notify.service';

const httpPostOptions = {

    headers:
        new HttpHeaders(
            {
                'Content-Type': 'application/json; charset=utf-8',
            }),
    withCredentials: true,
};

@Injectable({
    providedIn: 'root'
})
export class Manager360CommonService {

    webApiLocation = this.getApiLocation();

    private getApiLocation() {
        const port = location.port ? ':56888' : '';
        return location.protocol + '//' + location.hostname + port;
    }

    constructor(private httpClient: HttpClient) { }

     httpGetAsync(url: string) {

            return this.httpClient.get(this.webApiLocation + url, httpPostOptions)
                .pipe(map((response: Response) => {
                    return response;
                }))
                .toPromise()
                .catch((error: any) => {
                    this.onError(error);
                    return Promise.reject(error);
                });
        }
}

【问题讨论】:

  • 控件不会进入 catch() 块,因为响应码是 200(表示“ok”)。它并不表示请求有错误。您必须检查 if (result) { ...} 块中的状态代码,例如 if(result.status === 200)
  • 对不起,我不知道 httpPostAsync 最终需要一个 HttpContent。考虑到您将使用HttpClient,我已经给出了答案。但是,是的,正如上面评论中所说,如果它是成功响应,您的控件将不会捕获
  • 我刚刚更新了代码。我正在使用 httpclient
  • @Tom 您的httpPostOptions 将包含{observe: 'response'},添加它并记录结果以查看您将如何访问内容、状态等

标签: angular asp.net-web-api


【解决方案1】:

如果您收到响应状态为2xx 的响应,您的应用将不会运行来自catch 函数的代码。

如果您想在收到2xx 响应时显示该消息,则需要放置

this.notify.success('Classification Overrides Successfully Created');

if(result) 块之外。

如果您想根据成功状态码 (2xx) 显示消息,您应该使用请求选项 {observe: 'response'} 发送请求,然后在 then 函数中检查状态码

这是第一种情况的代码:

Save() {

        if (this.ClassificationOverrideDetails.ClassificationEntities.ID === 0) {
            this.Error = '';
            this.classificationOverrideService
                .createClassificationOverrideDetails(this.ClassificationOverrideDetails.ClassificationEntities)
                .then((result) => {
                    this.notify.success('Classification Overrides Successfully Created');
                    if (result) {
                        this.ClassficationOverrideDetailsEvent.next('init');

                    }
                }).catch(err => {
                    if (err.status !== 409) {
                        this.notify.error('An Error Has Occured While Updating Classification Overrides Details');
                    } else if (err.status === 409) {
                        this.notify.error('Product already exists for this Manager Strategy');
                    }
                });
        } 

【讨论】:

  • 嗨,Dusan,我刚刚更新了大部分代码。我在哪里设置 {observe: 'response'}
  • 我需要第二种情况,因为我需要执行 this.ClassficationOverrideDetailsEvent.next('init');基于成功
  • 如果应用程序运行then 函数表示响应成功,请告诉我您是否对状态码200 和201 进行了区分,还是对您来说是一样的?
  • 就像@xyz 说的,你应该把{observe: 'response'} 放在httpPostOptions 中
  • 基本上,如果记录被创建或更新,它会返回 200 我假设
猜你喜欢
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2017-07-28
相关资源
最近更新 更多