没有为URL找到Angular 2 HTTP GET 404

时间:2017-01-29 16:34:24

标签: angular typescript

我正在尝试将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/languagesapi/languagesanother/working/server/endpoint - 所有这些都会导致相同的错误。

我甚至尝试使用here所描述的JSONP,但是我遇到了一个不同的问题,即JSONP没有注入语言服务构造函数(我想这个问题是另一个主题)。

我找到了similar question,但到目前为止从未得到答案。

如果您有任何想法如何解决此问题或遇到类似问题 - 将非常感谢任何帮助或评论。

谢谢

3 个答案:

答案 0 :(得分:45)

出现此错误的原因是我使用Angular Tour of Heroes applcation作为我的基础,我没有删除依赖

 "angular-in-memory-web-api": "~0.2.4",
来自app.module.ts的

InMemoryWebApiModule。因此,所有请求都被InMemoryWebApiModule截获(尽管我没有像英雄巡回教程中所描述的那样直接调用它),这就是为什么我在浏览器调试器的“网络”选项卡中没有看到任何XMLHttpRequests。

package.jsonnode_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并选择“网络”选项卡)。既然您说它正在使用您的浏览器或邮递员,您可以比较这两个请求并快速找到差异。