【问题标题】:Angular: Bad Request error when calling postAngular:调用帖子时出现错误请求错误
【发布时间】:2019-09-08 00:25:15
【问题描述】:

在此处使用 Angular 6 和 C#。

在我的表单的按钮单击事件中,我想保存数据。该事件调用一个保存数据的 API。

下面是我的按钮点击事件:

submitData() {

      //After getting form values I create an object as below
      let myData = 
      {
        "name":name,
        "date": date,
        "status": status,
        "selection":selection,
        "createdBy": createdBy
      };

   this.myService.save(myData)
    .subscribe(
     (jsonData) => {
        //redirect etc after save

     });  
 }

在我的上述事件中,选择本身包含对象数组:

  0: {name: "u1", id: "123", type:"dev", comment: "comment1"}
  1: {name: "u2", id: "456", type:"prd", comment: "comment2"}

以下是我的服务电话:

   saveExtract(data) {
    return this.httpClient.post<any>(this.url + '/Save', data)
  .pipe(
    catchError())
);

}

最后下面是我的c# api;

 [HttpPost("Save", Name = "Save")]
    public async Task Save([FromBody] SaveModel data)
    {
       //do save here etc
    }

但上面的代码返回 400 (Bad Request) 错误。

我什至尝试将断点放在我的 api 中,但它从未命中。

所以当我打电话给我的帖子时似乎有问题。

谁能指出问题?

谢谢

---更新---

所以我错过了传递 httpOptions 和使用 Json.stringify 的代码。通过后部分工作如下:

const httpOptions = {
      headers: new HttpHeaders({
      'Content-Type': 'application/json'       
      })
    };

 saveExtract(data) {
    return this.httpClient.post<any>(this.url + '/Save', data, httpOptions)
  .pipe(
    catchError())
);

 this.myService.save(JSON.stringify(myData))
.subscribe(
 (jsonData) => {
    //redirect etc after save

 });

当我注释掉选择数组时,上面的代码有效,该数组是我要传递给 API 的数据的一部分。但是当我传递选择数组时不起作用并给出错误的请求错误。

那么任何人都可以指出我如何将对象数组传递给它。

【问题讨论】:

  • SaveModel 上是否有任何服务器端模型验证?您的 Save 操作或全局操作过滤器上是否有任何服务器端操作过滤器?
  • @Igor 我已经更新了我上面的帖子,请看一下
  • SaveModel 的定义是什么?与我们分享完整的控制器代码。

标签: angular asp.net-web-api asp.net-core-webapi


【解决方案1】:

这是一个将数组发送到 .net 核心的工作演示,检查与您的代码的差异。

客户端角度

export class FetchDataComponent {
constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) {

    let selection = [{ "name": "n1", "id": 1 }, { "name": "n2", "id": 2 }, { "name": "n3", "id": 3 }];
    let myData =
    {
    "name": "Tom",
    "selection": selection,
    };
    http.post<any>(baseUrl + 'api/SampleData/Save', myData).subscribe(result => {

    });
}
}

服务器端。

[Route("api/[controller]")]
public class SampleDataController : Controller
{       
    [HttpPost("Save", Name = "Save")]
    public async Task Save([FromBody] SaveModel data)
    {
        //do save here etc
    }       
}

public class SaveModel
{
    public string Name { get; set; }
    public List<MySelection> Selection { get; set; }
}
public class MySelection
{
    public int Id { get; set; }
    public string Name { get; set; }
}

一个更多节点,您可以在Startup.cs 中添加以下代码以避免api模型验证过滤器。

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });

【讨论】:

  • 我有类似的代码,但只是我的模型选择属性定义为:public List Selection { get;放; } = 新列表();这不正确吗?
  • API 期待字符串数组,而我正在发送对象数组。感谢您指出这一点。
猜你喜欢
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2019-05-21
相关资源
最近更新 更多