Angular 7 HttpClient post无法解析大请求正文?

问题描述 投票:0回答:1

Angular HttpClient 对请求正文大小有限制吗?

我正在做一个使用 REST API 的 Angular 项目。 API 很简单,只要使用 POST 方法命中文件的 API 端点,就替换 JSON 文件,并使用新的 JSON 对象作为请求正文。

如果新的 JSON 对象很小并且只有一些节点,则代码运行良好,但是当我尝试发送大对象时,代码会返回状态代码 400 的错误和错误消息“解析请求时出错”。错误是由大物体引起的还是我做错了?

上次返回错误是当我尝试发送约 1.5MB 大小的大 JSON 文件时,JSON 对象似乎是有效的,因为几个在线 json 格式化程序将其报告为有效的 json 对象。

如果我没有很好地解释我的问题,我很抱歉,因为我不是母语英语用户,而且我对角度世界也很陌生。谢谢

import { HttpClient, HttpHeaders, HttpErrorResponse } from "@angular/common/http";
import { take, catchError } from "rxjs/operators";
import { throwError, Observable } from "rxjs";
import { Injectable } from "@angular/core";

const headers = new HttpHeaders({
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Cache-Control': 'no-cache',
    'Access-Control-Allow-Origin': '*'
});

@Injectable()
export class configService {
    private _url = 'http://some-api-endpoint/';

    constructor(private http:HttpClient) { }

    private _save(data):Promise<any> {
        return this.http.post(this._url, data, { headers, responseType: 'text', observe:'response' })        
            .pipe(
                take(1),
                catchError(err => this._handleError(err))
            )
            .toPromise();
    }

    public async updateConfigFile(data): Promise<any> {

        try {
            const json = JSON.stringify(data, null, 2);
            const update = await this._save(json);
            if(update.status === 201) {
                return {
                    success: true,
                    data: update
                }
            } else {
                return {
                    success: false,
                    error: update
                }
            }
        } catch(err) {
            return {
                success: false,
                error: err.message
            }
        }        
    }

    private _handleError(error: HttpErrorResponse): Observable<never>{
        let errObj = {};
        if(error.error instanceof ErrorEvent) {
             const err = error.error
             console.warn('An client-side error occured:', {err});
             errObj = {
                 status: 'internal error',
                message: error.error.message
             }   
        } else {
             console.warn(`Backend returned code ${error.status} `, {error});
            errObj = {
                 status: error.status,
                 message: error.error
            }
        }

        return throwError(errObj);
    }
}
json angular rxjs angular-httpclient
1个回答
0
投票

据我所知,Angular 解析和发送消息没有问题。尽管大多数服务器对允许接收的消息大小都有限制。

因此您需要查看您的应用程序配置和主机。默认 IIS 配置不会处理超过 30MB 的请求,以避免拒绝服务攻击。大多数框架的最大值远低于此。

您的选择是:

  • 从正在序列化的对象中删除属性或更改属性名称以减少字符数。
  • 您可以更新应用程序/服务器以处理更大的消息。
  • 您可以使用不同的序列化程序来发送较小的消息。

TLDR:您必须减少消息的字符长度,或者更新应用程序的限制才能接受巨大的消息。

© www.soinside.com 2019 - 2024. All rights reserved.