You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中API调用未执行,但链接在Postman可正常使用问题排查

问题描述

我正在为训练营开发一个应用,功能包括:调用第三方API获取犬种信息,使用自研的两个API,通过EF将用户信息和用户收藏的犬种存储到两个SQL数据库中,前端采用Angular实现交互。

当前遇到的问题:通过模态表单创建User对象后,调用自定义API存入SQL数据库时,开发者工具显示链接字符串已生成、对象参数完整,但API调用未触发,数据也未存入数据库。不过将生成的链接字符串复制到Postman中调用,可正常添加用户到数据库。


相关代码

前端

用户接口

export interface IUser{
    Id?: number
    firstName: string
    lastName: string
    email: string
    password: string
}

api.service.ts

export class ApiService {
  private breedUri = 'https://dog-breeds2.p.rapidapi.com/dog_breeds';
  private userApi ='https://localhost:7078/api/Users';
  private faveApi ='https://localhost:7078/api/FavoriteBreeds';

  constructor(private http: HttpClient){}

  addUser(newUser: IUser){
   const linkString = (this.userApi+"/add?firstName="+newUser.firstName+"&lastName="+newUser.lastName+"&email="+newUser.email+"&password="+newUser.password)
    console.log("user api link created",{linkString})
   return this.http.post(this.userApi +"/add", newUser)
  }
}

app.component.ts 中的方法

constructor(private api: ApiService){}

addNewUser(){
    this.addform = document.getElementById('loginForm');
    const formData = new FormData(this.addform);

    let newUser: IUser = {
        firstName: formData.get("firstName") as string,
        lastName: formData.get("lastName") as string,
        email: formData.get("email") as string,
        password: formData.get("psw") as string
    };
    console.log("user object being created check", {newUser})
    this.api.addUser(newUser);
}

后端

[Route("api/[controller]")]
[ApiController]
public class UsersController : Controller
{
    UsersRepository repo=new UsersRepository();

    [HttpPost("add")]
    public Users AddNewUser(Users newUser)
    {
        return repo.AddNewUser(newUser);
    }
}

问题原因与修复方案

原因

Angular的HttpClient.post返回的是Observable,这是RxJS的惰性对象,只有调用subscribe()方法订阅它时,才会实际触发HTTP请求。当前代码仅调用了this.api.addUser(newUser)但未订阅,因此请求从未发送。

修复

修改app.component.ts中的addNewUser方法,添加订阅逻辑:

addNewUser(){
    this.addform = document.getElementById('loginForm');
    const formData = new FormData(this.addform);

    let newUser: IUser = {
        firstName: formData.get("firstName") as string,
        lastName: formData.get("lastName") as string,
        email: formData.get("email") as string,
        password: formData.get("psw") as string
    };
    console.log("user object being created check", {newUser})
    
    // 添加订阅触发请求
    this.api.addUser(newUser).subscribe({
        next: (response) => {
            console.log('用户添加成功', response);
            // 可在此添加表单重置、关闭模态框等后续逻辑
        },
        error: (err) => {
            console.error('添加用户失败', err);
            // 处理错误情况
        }
    });
}

额外说明

  • 你的api.service.ts中构造的linkString是基于URL查询参数的方式,但实际post请求是将newUser作为请求体发送,后端的AddNewUser方法默认会从请求体绑定参数,当前写法正确,Angular的HttpClient会自动设置Content-Type: application/json请求头,确保后端能正确解析参数。
  • Postman能成功调用是因为手动触发了请求,而Angular中必须通过订阅Observable来触发。

内容的提问来源于stack exchange,提问作者john Rizzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:00:06