对于Angular:$http404错误处理感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解angular的http,并且为您提供关于Angular2http结果的正确错误处理、angula
对于Angular:$ http 404错误处理感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解angular的http,并且为您提供关于Angular 2 http结果的正确错误处理、angular 2 – http错误处理程序中的注入服务、Angular 4.3 HttpClient (Angular访问 REST Web 服务) 二、Http 请求结果类型转换与错误处理、Angular 4中HTTP错误的集中处理的宝贵知识。
本文目录一览:- Angular:$ http 404错误处理(angular的http)
- Angular 2 http结果的正确错误处理
- angular 2 – http错误处理程序中的注入服务
- Angular 4.3 HttpClient (Angular访问 REST Web 服务) 二、Http 请求结果类型转换与错误处理
- Angular 4中HTTP错误的集中处理
Angular:$ http 404错误处理(angular的http)
我有2 ng-包括HTML。考虑服务器中是否不存在ng-include
src之一。截至目前,它只会加载空白html,并且在浏览器控制台中会显示未找到http-404文件。
因此,在这种情况下,我只想将默认错误页面(服务器中存在)加载到该特定div中,即一半显示默认错误页面,另一部分显示通过nginclude加载的正确div。
我的逻辑是,使用HTTP拦截器拦截所有HTTP调用。无论何时发生404错误,我都想返回默认错误页面,该页面必须仅加载到div中。因此,这就像嘲笑正确的http调用,而是发送错误页面,我认为必须将其加载到正确的div。
但这没有发生:)。我尝试使用默认的window.load(’‘)。但随后,它会加载到页面顶部,并存在于各个页面中。
还是我应该捕获div id(如果是,怎么办?),然后tat id加载默认错误HTML吗?
需要您的考虑。
答案1
小编典典要处理这种情况,您可以使用http拦截器(在此处找到文档:$
http)。
拦截器必须捕获404响应,从服务器加载404.html页面,并将其设置为初始响应的 数据 以及 状态 码200。
我创建了一个项目,展示了如何解决它。
仓库:https :
//github.com/matys84pl/angularjs-nginclude-
handling-404/
仔细看看main.js文件。
Angular 2 http结果的正确错误处理
我一直在使用angular.io文档中使用的http错误处理策略:
getHeroes () { return this.http.get(this._heroesUrl) .map(res => <Hero[]> res.json().data) .catch(this.handleError); } private handleError (error: Response) { console.error(error); return Observable.throw(error.json().error || 'Server error'); } }
在某些情况下,我将收到204状态代码(无数据),而不是JSON响应.在这种情况下,在通过res.json()解析结果失败之前不会调用错误处理程序,因此传递给handleError的错误是“error.json不是函数”.
如何查询响应流以检查200(OK)状态代码或响应头内容类型“application / json”,并通过更相关的错误消息发出错误处理程序的信号?
解决方法
http .get('Some Url') .map(res => { // If request fails,throw an Error that will be caught if(res.statu != 200) { throw new Error('This request has Failed ' + res.status); } // If everything went fine,return the response else {return res.json(); } })
这可能对你有所帮助.
这只是为了了解如何使用响应中的状态,您可以根据您的要求进行修改.
仅对非200代码抛出错误检查此commit
angular 2 – http错误处理程序中的注入服务
private handleError(error: any) { console.error(error); console.log(this.loginService); // <- always undefined return Observable.throw(error); }
我的问题是,this.loginService是未定义的,尽管它已在我的类中正确注入.它已经在其他方法中使用,但似乎在handleError中不可用.
http-catch调用方法的方式可能是问题吗?
如果是这样,我怎么能绕过那个?我需要在处理错误时执行一些逻辑.
这是一个关于如何将handleError方法设置为回调的示例(与文档完全相同)
this.http.get(url,ApiRequest.ACCEPT_JSON) .map(ApiHelper.extractData) .catch(this.handleError);
this.http.get(url,ApiRequest.ACCEPT_JSON) .map(res => ApiHelper.extractData(res)) .catch(err => this.handleError(err));
关于何时使用lambdas的一个非常好的读物:https://stackoverflow.com/a/23045200/1961059
Angular 4.3 HttpClient (Angular访问 REST Web 服务) 二、Http 请求结果类型转换与错误处理
Http Get响应(Response)类型转换
接着上一节。
1。在浏览器控制台中可以看到响应的JSON对象有许多属性(properties)。如果试着用data.login访问login属性会报错。
console.log(data.login);
因为Get返回的是Object类型。
Angular get原型
typescript
get(url: string,options?: {
headers?: HttpHeaders | {
[header: string]: string | string[];
};
observe?: 'body';
params?: HttpParams | {
[param: string]: string | string[];
};
reportProgress?: boolean;
responseType?: 'json';
withCredentials?: boolean;
}): Observable<Object>;
2。转换响应的object对象为自定义对象:
2.1 自定义类型UserResponse :
import { Component,OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Component({ selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit { title = 'app'; results = ''; constructor(private http: HttpClient){ } ngOnInit(): void { this.http.get<UserResponse>('https://api.github.com/users/seeschweiler').subscribe(data => { //console.log(data); console.log("User Login: " + data.login); console.log("Bio: " + data.bio); console.log("Company: " + data.company); }); } } interface UserResponse { login: string; bio: string; company: string; }
错误处理
1。由于一些可预见或不可预见的状况,会导致 HTTP失败。因此应该总是有处理这些错误状况的代码存在。 Get的subscribe方法有两个参数 未回调函数,用于处理Get成功与失败的情况。
subscribe方法原型
subscribe(next?: (value: T) => void,error?: (error: any) => void,complete?: () => void): Subscription;
失败处理
this.http.get<UserResponse>('https://api.github.com/users/seeschweiler').subscribe( data => { console.log("User Login: " + data.login); console.log("Bio: " + data.bio); console.log("Company: " + data.company); },//新增失败处理 err => { console.log("Error occured.") } );
2。失败详细信息:错误处理回调函数参数类型是any,可将其转换为HttpErrorResponse类型,并可获取更多错误属性信息。 HttpErrorResponse 需要从@angular/common/http导入才能使用。
完整app.component.ts
import { Component,OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import {HttpErrorResponse} from '@angular/common/http'; @Component({ selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit { title = 'app'; results = ''; constructor(private http: HttpClient){ } ngOnInit(): void { this.http.get<UserResponse>('https://api.github.com/users/seeschweiler').subscribe(data => { console.log(data); console.log("User Login: " + data.login); console.log("Bio: " + data.bio); console.log("Company: " + data.company); },(err: HttpErrorResponse) => { if (err.error instanceof Error) { console.log("Client-side error occured."); } else { console.log("Server-side error occured."); } } ); } } interface UserResponse { login: string; bio: string; company: string; }
Angular 4中HTTP错误的集中处理
我有角度2的工作原型:
@Injectable() export class MyErrorHandler extends ErrorHandler { constructor() { super(false); } handleError(error: any) { this.tellUser(error); super.handleError(error); } tellUser(error: any) { // dig for the root cause if (error.rejection) { error = error.rejection; } if (error instanceof ViewWrappedError) { error = error.originalError; } let message; if (error instanceof Response) { // Todo: localize and display nicely const messages = { 0: "Could not connect to server",} message = messages[error.status] || ("The server reported a system error (HTTP " + error.status + ")"); } else { message = "A system error occurred."; } console.warn(message); } }
但ViewWrappedError已被Angular 4替换为
export function viewWrappedDebugError(err: any,context: DebugContext): Error { if (!(err instanceof Error)) { // errors that are not Error instances don't have a stack,// so it is ok to wrap them into a new Error object... err = new Error(err.toString()); } _addDebugContext(err,context); return err; }
其中,由于在HttpResponse上调用toString,因此很难查询状态代码……
我希望angular能够为集中式错误处理提供一个公共的,支持良好的API.除了解析错误消息之外,真的没有办法集中处理HTTP错误吗?
更新:我更喜欢组件可以轻松覆盖集中式错误处理.
解决方法
然后,此服务成为您与Http相关的任何内容进行交互的集中点,因此您可以将错误处理集中在那里.在我开发的任何项目中,我总是创建这样一个类,因为几乎每个与之交互的API都有一些必须在每个请求中发生的常见配置(即使该配置与指定要使用的基本URL一样少).
这样一个类的例子:
export class ApiGateway { baseURL = "https://myapi.com"; // or sometimes pulled from another file constructor(private http: Http) { } get(path,params) { showLoadingIndicator(); let headers = this.createMySpecialHeaders(); let options = { headers: headers } // and whatever else you need to generalize let fullUrl = this.baseUrl + path + '?' + this.urlEncode(params)`; return this.get(path,params,options) .do(() => hideLoadingIndicator()) .map(res => res.json()) .catch(err => { hideLoadingIndicator(); // show error message or whatever the app does with API errors etc // sometimes rethrow the error,depending on the use case }) } }
对我来说,这是基本的OOP原则 – 在适配器类中包含与控件之外的事物的交互,以允许您对外部更改进行一些保护,并在必要时将该外部事物的API更改为您喜欢的内容.
如果有这样的类,例如,如果您升级到Angular 4并且接收错误的方法发生了变化,那么您只需要更改一个地方来处理新的错误技术.
我们今天的关于Angular:$ http 404错误处理和angular的http的分享就到这里,谢谢您的阅读,如果想了解更多关于Angular 2 http结果的正确错误处理、angular 2 – http错误处理程序中的注入服务、Angular 4.3 HttpClient (Angular访问 REST Web 服务) 二、Http 请求结果类型转换与错误处理、Angular 4中HTTP错误的集中处理的相关信息,可以在本站进行搜索。
本文标签: