我尝试将两个http请求链接到一个ASP.NET Core MVC Web Api。订单很重要,所以我尝试使用.flatMap()
。
我想调用get user方法(在单独的微服务上)
constructor(private dataService: DataService) { }
getUser(): Observable<User | null> {
if (!this.retrieve("IsAuthorized") || (this.retrieve("Email") === "" || this.retrieve("Email") === null)) {
return Observable.of(null);
}
return this.getUserByEmail(this.retrieve("Email"))
.do((user: User) => {
this.setCurrentUser(user);
});
}
public createUser(email: string, familyName: string, givenName: string, phoneNumber: string, gender: string): Observable<User | null> {
let createUser = this.dataService.post(this.usersApiUrl, null, {
Email: email, FamilyName: familyName,
GivenName: givenName, PhoneNumber: phoneNumber, Gender: gender
}).map(response => response.json());
return createUser.flatMap((res: Response) => { return this.getUser(); })
}
private setCurrentUser(user: User) {
this.currentUser.next(user);
}
private getUserByEmail(email: string): Observable<User> {
return this.dataService.get(this.usersApiUrl, email).map(response => response.json());
}
this.currentUser
是ReplaySubject<User> = new ReplaySubject<User>(1);
当前行为:POST(创建用户)按预期工作。 GET(this.getUser()
)没有被调用。
P.S:我对创建用户响应并不感兴趣,因为这只会告诉我它成功了。
更新
private retrieve(key: string): any {
var item = this.storage.getItem(key);
if (item && item !== 'undefined') {
return JSON.parse(this.storage.getItem(key));
}
return null;
}
this.storage
为localStorage
的位置。
我以经典的方式订阅了这个:
this.userService.createUser(this.authService.email, this.authService.familyName,
this.authService.givenName, this.authService.phoneNumber, this.authService.gender).subscribe(() => { });
答案 0 :(得分:0)
如果您所做的只是调用createUser
方法,那么我认为getUser
没有被触发,因为没有订阅它。将.subscribe()
添加到getUser
调用,看看是否有帮助。
答案 1 :(得分:0)
Rx&amp; amp;的最初尝试是正确的。客户端的观点。
该问题与ASP.NET Core MVC Web API有关,其中:
[HttpPost]
public void Post([FromBody]CreateUserRequest request)
{
_userService.Create(request);
}
返回200,其中包含空内容而不是204(无内容),这会导致流(rx)失败。
https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api
您可以将其更改为:
[HttpPost]
public IActionResult Post([FromBody]CreateUserRequest request)
{
_userService.Create(request);
return NoContent();
}