【发布时间】:2018-08-30 11:55:32
【问题描述】:
我偶然发现了一个问题。我有一个 Angular 5 网站和一个基于 C# WebApi 的后端。
在我的网站中,我得到了一个组件,它可以向后端发送一个发布请求,将新实体添加到数据库中。不幸的是,它没有发送请求或在后端收到。
bet.component.ts
import {Injectable} from '@angular/core';
import {Service} from './service';
import {Http, Headers, RequestOptions, Response} from '@angular/http';
import {AppConfig} from '../app-config';
import {Bet} from '../models/bet';
@Injectable()
export class BetService extends Service {
private url = this.config.apiUrl + '/bet';
constructor(private http: Http, private config: AppConfig) {
super();
}
addBet(bet: Bet) {
return this.http.post(this.url + '/add', bet);
}
}
BetController.cs
using System;
using System.Threading.Tasks;
using FakeBet.API.DTO;
using FakeBet.API.Services.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace FakeBet.API.Controllers
{
[Route("api/[controller]")]
public class BetController : Controller
{
private IBetService service;
public BetController(IBetService service)
{
this.service = service;
}
[HttpPost("[action]")]
public async Task<IActionResult> Add([FromBody] BetDTO bet)
{
try
{
await service.AddBetAsync(bet);
return Ok();
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
}
}
网址没问题。
我尝试将 bet.component.ts 更改为
return this.http.post(this.url + '/add', bet).subscribe(x => console.log('test'));
然后在后端收到响应,但BetDto bet 为空。
而 bet 不为 null 并且 Angular 和 Api 中的对象中的属性名称相同。
谁能告诉我我的错误在哪里?干杯!
BetDTO
using System;
using FakeBet.API.Models;
namespace FakeBet.API.DTO
{
public class BetDTO
{
public Guid BetId { get; set; }
public string MatchId { get; set; }
public string UserId { get; set; }
public int BetOnTeamA { get; set; }
public int BetOnTeamB { get; set; }
}
}
bet.ts
export class Bet {
matchId: string;
userId: string;
betOnTeamA: number;
betOnTeamB: number;
}
请求使用网站:website request
使用邮递员请求:postman request
【问题讨论】:
-
请发布minimal reproducible example 不是随机的代码部分
-
我在这里没有看到任何
HttpClient。有一个 Angular 脚本调用 Web API 控制器,在正文中传递一个 JSON 字符串。如果该主体与 BetDTO 类不匹配,则该参数将为空。BetDTO看起来像什么?顺便说一句,动作方法被命名为Add,所以URL应该是/add,而不是addBet -
如果 POSTMAN 工作,则意味着 Angular 和 C# 对象不相同或请求不同。使用 Fiddler 检查这两个请求的外观以及它们的不同之处。也许缺少内容类型标头? DTO 编码错误?
-
内容类型标头是否设置在角度部分?
-
@LewisTaylor 标题没有问题。是默认设置的,我试过手动设置还是不行。
标签: c# angular rest asp.net-web-api2