2017-08-24 27 views
10

Tôi có thiết lập API Core 2 bằng một số chức năng thử nghiệm. (Visual Studio 2017)Đối tượng POST API Asp.net Core 2 là NULL?

Sử dụng người đưa thư Tôi làm một bài đăng có dữ liệu thô với phương pháp đó, nhưng mô hình chỉ là trống? Tại sao?

 // POST api/Product/test 
     [HttpPost] 
     [Route("test")] 
     public object test(MyTestModel model) 
     { 
      try 
      { 
       var a = model.SomeTestParam; 

       return Ok("Yey"); 
      } 
      catch (Exception ex) 
      { 
       return BadRequest(new { message = ex.Message }); 
      } 
     } 

     public class MyTestModel 
     { 
      public int SomeTestParam { get; set; } 

     } 

enter image description here

enter image description here

Trả lời

15

Bạn cần phải bao gồm] thuộc tính [FromBody trên mô hình:

[FromBody] MyTestModel model 

Xem Andrew Lock post để biết thêm thông tin:

Để liên kết JSON chính xác trong ASP.NET Core, bạn phải sửa đổi hành động của mình để bao gồm thuộc tính [FromBody] trên tham số. Điều này cho phép khung công tác sử dụng tiêu đề kiểu nội dung của yêu cầu để quyết định cấu hình IInputFormatters nào được cấu hình để sử dụng cho ràng buộc mô hình.

Được ghi chú bởi @anserk trong các nhận xét, điều này cũng yêu cầu tiêu đề Content-Type được đặt thành application/json.

+4

Ông cũng cần phải thiết lập các kiểu nội dung ngay trong yêu cầu. Nó phải là 'application/json' chứ không phải' text'. – anserk

+0

khi tôi sử dụng [FromBody] người đưa thư hiển thị lỗi '415 Loại phương tiện không được hỗ trợ' và phương pháp không nhấn điểm gỡ lỗi, hãy xem nhận xét của tôi bên dưới, –

0

Để thêm thông tin để trả lời được chấp nhận:

Có ba nguồn mà từ đó các thông số đang bị ràng buộc tự động mà không cần dùng một thuộc tính:

giá trị biểu mẫu: Đây là những giá trị hình thức mà đi yêu cầu HTTP sử dụng phương thức POST. (bao gồm các yêu cầu của jQuery POST).

Giá trị tuyến đường: Tập hợp các giá trị tuyến đường được cung cấp bởi Định tuyến

Chuỗi truy vấn: Phần chuỗi truy vấn của URI.

Lưu ý rằng Body KHÔNG phải là một trong số chúng (mặc dù tôi nghĩ là phải).

Vì vậy, nếu bạn có các giá trị cần được ràng buộc khỏi phần thân, bạn PHẢI sử dụng thuộc tính binding attribute.

Điều này dẫn tôi đến ngày hôm qua vì tôi cho rằng các thông số từ Nội dung sẽ bị ràng buộc tự động.

Điểm phụ thứ hai là chỉ có một thông số có thể được ràng buộc với Nội dung.

Có thể có tối đa một thông số cho mỗi hành động được trang trí với [FromBody]. ASP.NET Core MVC run-time ủy nhiệm trách nhiệm đọc luồng yêu cầu tới trình định dạng. Khi luồng yêu cầu được đọc cho một tham số, thường không thể đọc lại luồng yêu cầu để ràng buộc các tham số [FromBody] khác.

Vì vậy, nếu có nhiều hơn một tham số bạn cần, bạn cần phải tạo ra một lớp mẫu để ràng buộc họ:

public class InputModel{ 
    public string FirstName{get;set;} 
    public string LastName{get;set;} 
} 

[HttpPost] 
public IActionResult test([FromBody]InputModel model)... 

The Docs

Các vấn đề liên quan