【问题标题】:angular2 http.post to a turned off server => return error on Android BUT NOT ON IOSangular2 http.post 到关闭的服务器 => 在 Android 上返回错误但不在 IOS 上
【发布时间】:2026-02-17 02:55:01
【问题描述】:

我正在使用 Angular 2、Ionic 2。

我关闭了我的应用向其发送请求的服务器,以检查离线模式的管理方式。

我基于import { Http, Headers, Response, RequestOptions, RequestMethod, Request } from '@angular/http' 为我的项目创建了自定义HTTP 服务。它包括一个“函数 sendRequest”:

public sendRequest = (data):Observable<Response> => {
    // console.log("CustomHttpService->sendRequest() starts");
    let headersToUse = new Headers();
    headersToUse.append("Content-type",'application/x-www-form-urlencoded');
    data = this.jsonToURLEncoded(data);
    let options = { headers:headersToUse };
    return this.http.post(this.url, data, options).map(
    (res:Response)=>{
        return res.json();
    }
    ).catch(
            this.handleErrorObservable
        );
  }

还有'函数handleErrorObservable':

private handleErrorObsevable (error:Response|any){
    console.log("handleError error.message " + error.message);
    console.log("handleError error " + error);
    return Observable.throw(error.message || error);
}

在 Android 中它可以工作,一段时间后我进入日志:

handleError 错误响应,URL 状态为 0:null

但在 IOS 上,错误永远不会出现,就像没有设置超时一样。有什么建议吗?

【问题讨论】:

    标签: android ios angular ionic2 angular2-http


    【解决方案1】:

    我个人更喜欢使用@angular/http 的这种形式来处理错误,并且它始终有效。

    this.http.post(url, data)
        .map(res => res.json())
        .subscribe((data) => {
          // Use returned data
         },
         (err) => {
                // Handle the error here
              });
    

    (err) 部分有助于处理所有与网络相关的错误,即使服务器处于离线状态也是如此。希望这会有所帮助。

    【讨论】:

    • 它给出的结果和以前一样。该错误在 Android 中显示,但在 IOS 上不显示。
    • 您是否尝试在 safari 浏览器中为应用程序提供服务,以查看 http 错误处理是否正常
    • 我在 SAFARI 中进行了ionic serve 测试,我遇到了同样的问题。它确实在控制台中显示一条警告消息,表明请求已按时超时,但该消息与我的代码无关。它不会触发.catch(this.handleErrorObservable),也不会通过console.log(...) 显示错误。至少该错误在 Apple 浏览器中是一致的。
    【解决方案2】:

    我通过在我的函数中像in that SO question 这样的可观察对象添加自定义超时设置来解决它。现在看起来是这样的:

    public sendRequest = (data):Observable<Response> | Observable<any> => {
    // console.log("CustomHttpService->sendRequest() starts");
    
        let headersToUse = new Headers();
        headersToUse.append("Content-type",'application/x-www-form-urlencoded');
    
        data = this.jsonToURLEncoded(data);
    
        let options = { headers:headersToUse };
    
        return this.http.post(this.url, data, options).timeoutWith(CustomHttpService.TIMEOUT_DELAY,Observable.throw(new Error(CustomHttpService.ERROR_REQ_HTTP))).map(
            (res:Response)=>{
                return res.json();
            }
        )
        .catch(this.handleErrorObservable)
    }
    
    private handleErrorObservable (error:Response|any){
        console.error(CustomHttpService.CLASS_TAG + " handlerErrorObservable: error.message " + error.message);
    
        return Observable.throw(error.message);
    
    }
    

    还需要在类的顶部添加一些特定的导入以使用函数timeoutWithObservable.throwimport 'rxjs/add/operator/timeoutWithimport 'rxjs/add/observable/throw 就像在 official Angular2 doc 中解释的那样。

    【讨论】:

      最近更新 更多