Правильный тип возврата со статусом из Web API и Swagger - PullRequest
2 голосов
/ 16 апреля 2019

Вопрос такой же, как этот . Я хочу получить объект из IActionResult со связанным статусом html, но Swagger покажет мне сообщение «ОК» вместо связанного статуса.

Я искал много часов, чтобы найти ошибку в конфигурациях, и я не нашел ничего, чтобы решить проблему. Я покажу вам код:

Вот результат IActionResult:

[HttpPut("updateuserpricingplan")]
[ProducesResponseType(200)]
[ProducesResponseType(400, Type = typeof(ServiceValidationResult))]
public async Task<IActionResult> UpdateSelection([FromBody]UpdatePricingPlanModel model)
{
    var user = await _userService.GetSignedIdUser(this.HttpContext);
    var result = await _userService.UpdateUserPricingPlan(user, model.PricingPlanId, _settingService, model.Code);

    if (result.Succeeded)
        return Ok();

    return new ObjectResult(result) { StatusCode = 400 };
}

Интересно узнать, что я вижу результат и код состояния на вкладке Сеть / Ответ в Google Chrome.

Вот как я написал подписку

this.pricingPlanService.updateSelection(model)
      .subscribe(res => {
        console.log(res.result);
      }, err => { // <== I got "OK" result as string and nothing else
        console.log(err.status);
        console.log(err.response);
      }, () => {
        this.sessionService.updatePricingPlan(selectedPricingPlan.id);
      });

Теперь вот версии, которые я использую:

  • NSwagStudio: 12.1.0.0
  • Угловой: 7.0.4
  • ASP.net Core 2.2.4

Если это могло бы помочь, здесь код, который генерируется NSwagStudio для updateSelection. Обратите внимание, что if (response_ instanceof HttpResponseBase) швы всегда ложны.

updateSelection(model: UpdatePricingPlanModel): Observable<SwaggerResponse<void>> {
        let url_ = this.baseUrl + "/api/PricingPlan/updateuserpricingplan";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(model);

        let options_ : any = {
            body: content_,
            observe: "response",
            responseType: "blob",
            headers: new HttpHeaders({
                "Content-Type": "application/json", 
            })
        };

        return this.http.request("put", url_, options_).pipe(_observableMergeMap((response_ : any) => {
            return this.processUpdateSelection(response_);
        })).pipe(_observableCatch((response_: any) => {
            if (response_ instanceof HttpResponseBase) {
                try {
                    return this.processUpdateSelection(<any>response_);
                } catch (e) {
                    return <Observable<SwaggerResponse<void>>><any>_observableThrow(e);
                }
            } else
                return <Observable<SwaggerResponse<void>>><any>_observableThrow(response_);
        }));
    }

    protected processUpdateSelection(response: HttpResponseBase): Observable<SwaggerResponse<void>> {
        const status = response.status;
        const responseBlob = 
            response instanceof HttpResponse ? response.body : 
            (<any>response).error instanceof Blob ? (<any>response).error : undefined;

        let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }};
        if (status === 200) {
            return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
            return _observableOf<SwaggerResponse<void>>(new SwaggerResponse(status, _headers, <any>null));
            }));
        } else if (status === 400) {
            return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = resultData400 ? ServiceValidationResult.fromJS(resultData400) : <any>null;
            return throwException("A server error occurred.", status, _responseText, _headers, result400);
            }));
        } else if (status !== 200 && status !== 204) {
            return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            }));
        }
        return _observableOf<SwaggerResponse<void>>(new SwaggerResponse(status, _headers, <any>null));
    }

Видите ли вы какую-либо ошибку или неправильную конфигурацию?

Спасибо за любую помощь,

...