2016-11-28 18 views
9

Đây có thể là một cái gì đó rất cơ bản, nhưng tôi gặp khó khăn trong việc tìm ra nơi tôi đang đi sai.Tham số chuỗi FromBody cho null

Tôi đang cố gắng lấy một chuỗi từ phần nội dung của POST, nhưng "jsonString" chỉ hiển thị dưới dạng null. Tôi cũng muốn tránh sử dụng một mô hình, nhưng có lẽ điều này là không thể. Các đoạn mã mà tôi đang đánh với Postman là đoạn này:

[Route("Edit/Test")] 
[HttpPost] 
public void Test(int id, [FromBody] string jsonString) 
{ 
    ... 
} 

Có lẽ nó là một cái gì đó tôi đang làm sai với người đưa thư, nhưng tôi đã cố gắng để sử dụng "= test" (như trong các câu hỏi khác hỏi về chủ đề này) trong phần giá trị của phần body - x-www-form-urlencoded với khóa là jsonString và không có gì. Tôi cũng đã thử sử dụng nguyên - văn bản và nguyên - văn bản/đồng bằng. Tôi nhận được id vì vậy tôi biết url là chính xác. Bất kỳ sự giúp đỡ này sẽ được đánh giá rất nhiều.

Postman được thiết lập như hiện nay:

POST http://localhost:8000/Edit/Test?id=111 
key = id value = 111 
Body - x-www-form-urlencoded 
key = jsonString value = "=test" 
+0

Bạn có thể vui lòng cung cấp đầy đủ yêu cầu http bao gồm URL và nội dung trong câu hỏi của bạn không. –

+0

Ít nhất 'Request.Content.ReadAsStringAsync()' sẽ hoạt động. – Fabio

+1

Tôi tin rằng điều này là có thể. Đặt tiêu đề của bạn 'Content-Type: application/x-www-form-urlencoded'. Nội dung phải là '= test' (không có gì khác). – Igor

Trả lời

12

Bằng cách khai báo các tham số jsonString với [FromBody] bạn nói với ASP.NET Core để sử dụng các định dạng đầu vào để ràng buộc các JSON cung cấp (hoặc XML) đến một mô hình. Vì vậy, kiểm tra của bạn nên làm việc, nếu bạn cung cấp một mô hình lớp học đơn giản

public class MyModel 
{ 
    public string Key {get; set;} 
} 

[Route("Edit/Test")] 
[HttpPost] 
public void Test(int id, [FromBody] MyModel model) 
{ 
    ... model.Key.... 
} 

và gửi JSON như

{ 
    key: "value" 
} 

Tất nhiên bạn có thể bỏ qua mô hình ràng buộc và lấy dữ liệu được cung cấp trực tiếp bằng cách truy cập HttpContext.Request trong bộ điều khiển. Thuộc tính HttpContext.Request.Body cung cấp cho bạn luồng nội dung hoặc bạn có thể truy cập dữ liệu biểu mẫu qua HttpContext.Request.Forms.

Cá nhân tôi thích ràng buộc mô hình vì sự an toàn kiểu.

+1

Trong câu hỏi đã được đề cập: _ Tôi cũng muốn tránh sử dụng một mô hình _... – Fabio

+1

@Fabio - sau đó [FromBody] sẽ không hoạt động, bởi vì nó cho khung bạn muốn kết buộc dữ liệu vào một lớp mô hình. Để tránh sự ràng buộc, bỏ qua tham số này và truy cập dữ liệu được gửi trực tiếp như được gợi ý trong đoạn cuối. Hy vọng rằng sẽ giúp đỡ. –

2

Bạn đang đi đúng hướng.

On tiêu đề của bạn thiết lập

Content-Type: application/x-www-form-urlencoded 

Cơ thể của yêu cầu POST nên =test và không có gì khác. Đối với các chuỗi chưa biết/biến, bạn phải mã hóa URL giá trị sao cho bạn không vô tình thoát với ký tự đầu vào.


Xem thêm POST string to ASP.NET Web Api application - returns null

12

Tham khảo Parameter Binding in ASP.NET Web API

Sử dụng [FromBody]

Buộc Web API để đọc một kiểu đơn giản ra khỏi cơ thể theo yêu cầu, thêm [FromBody] thuộc tính cho tham số:

[Route("Edit/Test")] 
[HttpPost] 
public IHttpActionResult Test(int id, [FromBody] string jsonString) { ... } 

Trong ví dụ này, Web API sẽ sử dụng một phương tiện truyền thông kiểu định dạng để đọc các giá trị của jsonString ra khỏi cơ thể theo yêu cầu. Dưới đây là ví dụ về yêu cầu của khách hàng .

POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1 
User-Agent: Fiddler 
Host: localhost:8000 
Content-Type: application/json 
Content-Length: 6 

"test" 

Khi tham số có [FromBody], Web API sử dụng tiêu đề Loại nội dung để chọn trình định dạng. Trong ví dụ này, loại nội dung là "ứng dụng/json" và phần thân yêu cầu là chuỗi JSON thô (không phải là đối tượng JSON ).

Trong ví dụ trên, không cần mô hình nếu dữ liệu được cung cấp ở định dạng chính xác trong nội dung.

Đối với URL được mã hóa một yêu cầu sẽ trông như thế này

POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1 
User-Agent: Fiddler 
Host: localhost:8000 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 5 

=test 
+1

Chính xác! Điều đó nhỏ = giải quyết vấn đề. Tôi nhớ đã mất nhiều ngày khi tôi làm việc trong dự án đầu tiên của tôi, bởi vì nó không được đề cập trong bất kỳ cuốn sách api web nào mà tôi có. :( –

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