Asp.net web api .NET核心&x2B;Angular CLI应用程序-can';t将数据从api传递到组件
我正在用Angular CLI构建一个ASP.NET核心应用程序 应用程序工作得很好,在VS中启动应用程序之前,我将预构建事件设置为ng build,它工作得很好。我还可以通过localhost:port/API/[controller]成功访问我的API(在本例中,它应该是联系人,因为它应该是一个联系人簿) 现在,我试图让Angular直接从API获取数据。出于这个原因,我创建了一个IContact接口,一个ContactService,并将它传递给ContactComponent,该组件应该显示它 我可能在这里犯了一个愚蠢的错误(我的技能非常基础),但由于某些原因,我甚至没有看到运行应用程序时通过网络日志输入的object.json(在尝试将其传递到视图之前,我试图确保首先从API获取数据) 我可能做错了什么(所以我鼓励你回答,即使你认为你可能在说一些愚蠢的显而易见的东西),但我的问题是:Asp.net web api .NET核心&x2B;Angular CLI应用程序-can';t将数据从api传递到组件,asp.net-web-api,asp.net-core,angular-cli,single-page-application,Asp.net Web Api,Asp.net Core,Angular Cli,Single Page Application,我正在用Angular CLI构建一个ASP.NET核心应用程序 应用程序工作得很好,在VS中启动应用程序之前,我将预构建事件设置为ng build,它工作得很好。我还可以通过localhost:port/API/[controller]成功访问我的API(在本例中,它应该是联系人,因为它应该是一个联系人簿) 现在,我试图让Angular直接从API获取数据。出于这个原因,我创建了一个IContact接口,一个ContactService,并将它传递给ContactComponent,该组件应该
- 我下面的代码是否应该工作(虽然没有附加导入,但我想我已经获得了所有导入,但请检查我;-)?我说的不是超高效的东西,只是完成工作的基础
- 查看getAPI服务是否正常工作的最佳方法是什么?如果您只是将服务导入组件并尝试调用get方法,那么这是否就是浏览器中的网络日志记录?还是有别的办法李>
- 我对应用程序总体架构的逻辑和方法是否正确,或者我有什么地方出错了?:-)李>
const API_URL = environment.apiUrl;
@Injectable()
export class ContactService {
constructor(private http: Http) { }
public getContacts(): Observable<IContact[]> {
return this.http.get(API_URL)
.map((response: Response) => <IContact[]>response.json())
.catch(this.handleError);
}
private handleError(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error')
}
}
contact.component.ts
@Component({
selector: 'app-contact',
templateUrl: './contact.component.html',
styleUrls: ['./contact.component.css'],
providers: [ContactService]
})
export class ContactComponent implements OnInit {
private _contactService: ContactService;
private contactlist: IContact[];
constructor() {
}
public ngOnInit() {
this._contactService.getContacts()
.subscribe((contacts) => { this.contactlist = contacts });
}
}
任何其他代码要求或任何东西-让我知道。感谢所有反馈。谢谢 我稍微更改了您的代码 文件icontact.ts。我制作了
IContact
一个简单的字体。您可以使其成为支持对象形状的界面
export type IContact = string;
文件contact.service.ts。我们调用/api/values
api,如果您遵循前面提到的教程,它将在新的ASP.NET核心Web api项目中默认创建
import { Injectable } from "@angular/core";
import { Http } from "@angular/http";
import { Observable } from "rxjs/Observable";
import 'rxjs/add/operator/map'
import { IContact } from "./icontact";
const API_URL = '/api/values'; // environment.apiUrl;
@Injectable()
export class ContactService {
constructor(private http: Http) { }
public getContacts(): Observable<IContact[]> {
return this.http.get(API_URL)
.map(response => <IContact[]>response.json());
}
}
在Startup.cs中的Configure方法中,确保将app.Use(…)
调用放在app.UseStaticFiles()之前
由于您通过ASP.NET核心中间件从wwwroot为Angular应用程序提供服务,因此Angular应用程序和Web API的主机相同,因此您不需要为该设置配置CORS
顺便说一句,您可能有兴趣看看Visual Studio市场上的。(免责声明:我是作者。)项目模板支持项目的开箱即用设置。您得到API的答案了吗?您可以在浏览器中通过网络/调试部分进行检查吗?我不这么认为:我要查找的json应该提供5个不同的联系人,而不是一个;-)你考虑过CORS问题吗?我看不到你链接的图片上的任何内容。由于项目设置,这里不需要CORS-请参阅正确答案最后一段之前的内容。这只是一个错误的角度服务代码的问题!这已经做到了!非常感谢你!我终于看到了这个对象:我并没有完全按照您在这里所说的那样做,但是在contact组件上修复getContacts方法和构造函数完成了这项工作。现在我正在与显示器进行斗争,因为我无法使联系人正确显示在页面上;-)
import { Injectable } from "@angular/core";
import { Http } from "@angular/http";
import { Observable } from "rxjs/Observable";
import 'rxjs/add/operator/map'
import { IContact } from "./icontact";
const API_URL = '/api/values'; // environment.apiUrl;
@Injectable()
export class ContactService {
constructor(private http: Http) { }
public getContacts(): Observable<IContact[]> {
return this.http.get(API_URL)
.map(response => <IContact[]>response.json());
}
}
import { Component, OnInit } from "@angular/core";
import { ContactService } from "./contact.service";
import { IContact } from "./icontact";
@Component({
selector: 'app-contact',
template: '<div *ngFor="let contact of contactList">{{contact}}</div>',
providers: [ContactService]
})
export class ContactComponent implements OnInit {
private contactList: IContact[];
constructor(private contactService: ContactService) { }
public ngOnInit() {
this.contactService.getContacts().subscribe(
(contacts) => { this.contactList = contacts; },
(error) => { console.log(error); }
);
}
}
<app-contact>Wait...</app-contact>
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';
import { ContactComponent } from "./contact.component";
@NgModule({
declarations: [AppComponent, ContactComponent],
imports: [BrowserModule, HttpModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }