2014-04-11 32 views
28

Tôi có một dự án API Web và đúng phương pháp của tôi luôn trả về HttpResponseMessage.Cách tiếp cận tốt nhất của API Web để trả lại HttpResponseMessage

Vì vậy, nếu nó hoạt động hay thất bại tôi trở lại:

Không có lỗi:

return Request.CreateResponse(HttpStatusCode.OK,"File was processed."); 

Bất kỳ lỗi hoặc không

return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process."); 

Khi tôi trở về một đối tượng sau đó tôi sử dụng:

return Request.CreateResponse(HttpStatusCode.OK, user); 

Tôi muốn biết làm thế nào tôi có thể trở lại cho khách hàng HTML5 tôi một respose đóng gói tốt hơn, vì vậy tôi có thể trở lại biết thêm thông tin về giao dịch vv

Tôi đã suy nghĩ về việc tạo ra một lớp tùy chỉnh mà có thể rút gọn các HttpResponseMessage nhưng cũng có nhiều dữ liệu hơn.

Có ai đã thực hiện điều gì đó tương tự không?

+0

Bạn không được sử dụng bất kỳ Nội dung nào trong HttpStatusCode.NoContent. – kappadoky

+0

Nói chung nếu bạn trả về một HttpActionResult với 'HttpStatusCode.NoContent', nó sẽ - bất ngờ - trả về không có nội dung, ngay cả khi bạn đang đi qua trong một chuỗi như trong trường hợp của bạn ở trên. Có thể là một lỗi đáng ngạc nhiên. Giống như câu trả lời của người dùng BigTone bên dưới. Điều này có nghĩa là quá theo đặc điểm kỹ thuật https://httpstatuses.com/204 'Đáp 204 được chấm dứt bởi dòng trống đầu tiên sau các trường tiêu đề vì nó không thể chứa nội dung thư.' – mmcrae

Trả lời

32

Mặc dù điều này không trực tiếp trả lời câu hỏi, tôi muốn cung cấp một số thông tin tôi thấy hữu ích. http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

HttpResponseMessage đã được thay thế nhiều hơn hoặc ít hơn với IHttpActionResult. Nó sạch hơn nhiều để sử dụng dễ dàng hơn.

public IHttpActionResult Get() 
{ 
    Object obj = new Object(); 
    if (obj == null) 
     return NotFound(); 
    return Ok(obj); 
} 

Sau đó, bạn có thể rút gọn để tạo ra những tùy chỉnh. How to set custom headers when using IHttpActionResult?

Tôi chưa tìm thấy nhu cầu để triển khai kết quả tùy chỉnh nhưng khi tôi làm, tôi sẽ đi tuyến đường này.

Nó có thể rất giống với việc sử dụng cái cũ.

Để mở rộng thêm về điều này và cung cấp thêm một chút thông tin. Bạn cũng có thể bao gồm tin nhắn với một số yêu cầu. Ví dụ.

return BadRequest("Custom Message Here"); 

Bạn không thể thực hiện việc này với nhiều ứng dụng khác nhưng giúp cho các tin nhắn thông thường bạn muốn gửi lại.

+2

Nhờ bạn, tôi sẽ không bao giờ sử dụng HttpResponseMessage đáng sợ một lần nữa – LastTribunal

4

Bạn có thể trả về phản hồi lỗi để cung cấp thêm chi tiết.

public HttpResponseMessage Get() 
{ 
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } }; 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError); 
} 

Would return:

{ 
    "Message": "The file has no content or rows to process.", 
    "CustomErrorCode": 42 
} 

Xem thêm chi tiết ở đây: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

tôi cũng sử dụng http://en.wikipedia.org/wiki/List_of_HTTP_status_codes để giúp tôi xác định những gì http mã trạng thái trở lại.

2

Một lưu ý quan trọng: Không đưa nội dung vào 204 câu trả lời! Không chỉ là nó chống lại các đặc điểm kỹ thuật HTTP, nhưng NET thực sự có thể hành xử theo cách cư xử bất ngờ nếu bạn làm.

Tôi đã sử dụng nhầm return Request.CreateResponse(HttpStatusCode.NoContent, null); và dẫn đến một cơn đau đầu thực sự; các yêu cầu trong tương lai từ cùng một phiên sẽ bị phá vỡ do có giá trị chuỗi "null" được thêm vào trước phản hồi. Tôi đoán .NET không phải lúc nào cũng làm rõ ràng đối tượng phản hồi cho các cuộc gọi API từ cùng một phiên.

+0

Nói chung nếu bạn trả về một HttpActionResult với 'HttpStatusCode.NoContent', nó sẽ - bất ngờ - không trả lại nội dung nào, ngay cả khi bạn đang chuyển nội dung như trong trường hợp của OP ở trên. Có thể là một lỗi đáng ngạc nhiên. – mmcrae

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