我正在尝试将Angular 2应用程序与Java Spring Boot后端集成。目前,我将Angular 2文件放在src/main/resources/static
下(意味着Angular和Spring应用程序在同一端口上运行相同的应用程序)。
我正在尝试像这样执行HTTP GET:
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Language } from '../model/language';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
@Injectable()
export class LanguageService {
constructor(private http: Http) { }
private langUrl = 'api/languages';
getLanguages() : Observable<Language[]> {
return this.http.get(this.langUrl)
.map((res:Response) => res.json())
}
}
我故意从get中删除了错误处理代码,因为它会导致误导性错误。 我得到的是:
Error: Uncaught (in promise): Error: Error in :0:0 caused by: Response with status: 404 Not Found for URL: api/languages
Error: Error in :0:0 caused by: Response with status: 404 Not Found for URL: api/languages
at ViewWrappedError.BaseError [as constructor] (http://localhost:8000/node_modules/@angular/core/bundles/core.umd.js:1179:31) [angular]
at ViewWrappedError.WrappedError [as constructor] (http://localhost:8000/node_modules/@angular/core/bundles/core.umd.js:1232:20) [angular]
at new ViewWrappedError (http://localhost:8000/node_modules/@angular/core/bundles/core.umd.js:6552:20) [angular]
//more output here - will provide full stack trace if needed
URL http://localhost:8080/api/languages
由Java Spring控制器处理,如果我通过Postman或Web浏览器进行GET操作,它就可以工作。
我的印象是404错误不是来自服务器,因为:
我认为我的Angular 2配置有问题,但我在文档中找不到任何提示。
我尝试了不同的网址,例如http://localhost:8080/api/languages
,/api/languages
,api/languages
,another/working/server/endpoint
- 所有这些都会导致相同的错误。
我甚至尝试使用here所描述的JSONP,但是我遇到了一个不同的问题,即JSONP没有注入语言服务构造函数(我想这个问题是另一个主题)。
我找到了similar question,但到目前为止从未得到答案。
如果您有任何想法如何解决此问题或遇到类似问题 - 将非常感谢任何帮助或评论。
谢谢
答案 0 :(得分:45)
出现此错误的原因是我使用Angular Tour of Heroes applcation作为我的基础,我没有删除依赖
"angular-in-memory-web-api": "~0.2.4",
来自app.module.ts的和InMemoryWebApiModule
。因此,所有请求都被InMemoryWebApiModule截获(尽管我没有像英雄巡回教程中所描述的那样直接调用它),这就是为什么我在浏览器调试器的“网络”选项卡中没有看到任何XMLHttpRequests。
从package.json
和node_modules
目录中删除依赖项后,它开始正常工作,但是,我不得不更改服务代码,直接将Json解析为TypeScript对象,如下所示:
getLanguages(): Promise<Language[]> {
return this.http.get(this.langUrl)
.toPromise()
.then(response => response.json() as Language[])
.catch(this.handleError);
}
这是一个新手的错误,但我希望这篇文章可以节省几个小时的研究。
答案 1 :(得分:1)
我有一个类似的问题,经过一些令人沮丧的研究后,我通过this解决了404错误。进口的顺序很重要 希望它可以帮到某人。
答案 2 :(得分:0)
在Chrome或Firefox中,您可以看到应用程序执行的HTTP请求和响应(只需按F12并选择“网络”选项卡)。既然您说它正在使用您的浏览器或邮递员,您可以比较这两个请求并快速找到差异。