没有为URL找到Angular 2 HTTP GET 404

mp_*_*oki 21 typescript angular

我正在尝试将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())
     }
}
Run Code Online (Sandbox Code Playgroud)

我故意从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
Run Code Online (Sandbox Code Playgroud)

URL http://localhost:8080/api/languages由Java Spring控制器处理,如果我通过Postman或Web Browser进行GET操作,它就可以工作.

我的印象是404错误不是来自服务器,因为:

  • 我在服务器日志中看不到任何活动
  • 无论服务器端是启动还是关闭,我都会得到相同的结果.

我认为我的Angular 2配置有问题,但我没有在文档中找到任何提示.

我尝试了不同的网址,比如http://localhost:8080/api/languages,/api/languages,api/languages,another/working/server/endpoint-都导致了同样的错误.

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

我发现了一个类似的问题,但到目前为止从未得到过回答.

如果您有任何想法如何解决此问题或遇到类似问题 - 任何帮助或评论将受到高度赞赏.

谢谢

mp_*_*oki 46

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

 "angular-in-memory-web-api": "~0.2.4",
Run Code Online (Sandbox Code Playgroud)

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

我已删除从依赖关系后package.json和node_modules目录,它开始正常工作,但是,我不得不更改服务代码来解析JSON直接打字稿对象是这样的:

getLanguages(): Promise<Language[]> {
    return this.http.get(this.langUrl)
        .toPromise()
        .then(response => response.json() as Language[])
        .catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)

这是一个新手的错误,但我希望这篇文章可以节省几个小时的研究.

  • 只是要补充一点,你可以配置内存web api来传递你不希望它处理的URL,所以不需要完全删除它 - 请参阅[answer](http://stackoverflow.com/questions/ 41076251 /如何-I-可以旁路-角内存的Web-API换一个特定的URL?answertab =活性#制表顶部) (6认同)