2010-08-01 25 views
12

Vì yêu cầu POST trong mẫu POST/Redirect/GET (PRG) trả về mã trạng thái (303 See Other) thành công, có thể thông báo khách hàng của hương vị thành công cụ thể mà họ muốn tận hưởng (ví dụ: OK, Được tạo, Được chấp nhận, v.v.) cũng như bất kỳ tiêu đề thích hợp nào (ví dụ: Location cho số 201 Created, có thể xung đột với chuyển hướng)?POST/Redirect/GET (PRG) so với mã phản hồi 2xx có ý nghĩa

Ví dụ: để chuyển hướng GET có đáp ứng với mã phản hồi thích hợp & tiêu đề được mong đợi từ phản hồi POST không?

Các HTTP 1.1 spec nói:

Phương pháp này [303] tồn tại chủ yếu để cho phép đầu ra của một kịch bản POST-kích hoạt để chuyển hướng user agent tới một tài nguyên được chọn.

Nhưng không cung cấp bất kỳ thông tin chi tiết nào về việc mất mã trạng thái và tiêu đề thông thường hơn.

Edit - Một ví dụ:

Một khách hàng gửi yêu cầu POST để /orders mà tạo ra một nguồn lực mới tại /orders/1.

Nếu máy chủ gửi trạng thái 201 Created với location: /orders/1, khách hàng tự động sẽ vui vì nó biết tài nguyên đã được tạo và biết nó ở đâu, nhưng con người sử dụng trình duyệt web sẽ không hài lòng. trang /orders một lần nữa và nếu họ làm mới, họ sẽ gửi một đơn đặt hàng khác, điều này dường như không phải là thứ họ muốn.

Nếu máy chủ gửi trạng thái 303 See Other với location: /orders/1, con người sẽ được đưa đến đơn đặt hàng của họ, được thông báo về sự tồn tại và trạng thái của nó và sẽ không có nguy cơ lặp lại nó một cách tình cờ. Tuy nhiên, khách hàng tự động sẽ không được nói rõ ràng về việc tạo tài nguyên, nó sẽ phải suy ra việc tạo dựa trên tiêu đề location. Hơn nữa, nếu 303 chuyển hướng đến một nơi khác (ví dụ: /users/someusername/orders) thì con người có thể được chứa đầy đủ, nhưng khách hàng tự động bị bỏ lại không đáng kể.

Đề nghị của tôi là để gửi 201 Created như đáp ứng với yêu cầu get chuyển hướng trên tài nguyên mới, nhưng tôi càng nghĩ về nó, càng ít tôi thích nó (có thể là khó khăn để đảm bảo chỉ người tạo nhận 201 và nó không nên xuất hiện yêu cầu GET đã tạo tài nguyên).

Phản ứng tối ưu trong tình huống này là gì?

+0

Bạn có thể đưa ra ví dụ về suy nghĩ của bạn không? – Gumbo

+0

Tôi đã chỉnh sửa câu hỏi để cung cấp một ví dụ. Cảm ơn. –

+0

Chỉ cần rõ ràng: Bạn đã đảm bảo rằng một người dùng con người sẽ được thông tin đầy đủ về những gì vừa xảy ra, và bây giờ bạn đang cố gắng làm điều tương tự cho một người tự động? – sdleihssirhc

Trả lời

1

Nếu bạn có quyền kiểm soát máy chủ web, làm thế nào để phân biệt giữa tiêu đề Tác nhân? Điền nó vào một cái gì đó chỉ bạn biết (một GUID hoặc giả ngẫu nhiên khác) và trình bày rằng một đến máy chủ web từ khách hàng tự động. Sau đó, có phản hồi máy chủ web với 201/303 cho phù hợp.

3

Gửi thông tin định hướng người dùng trong nội dung phản hồi dưới dạng HTML. Không phân biệt tiêu đề Tác nhân người dùng; nếu bạn cũng cần phải gửi các cơ quan đến máy, phân biệt dựa trên tiêu đề Yêu cầu chấp nhận.

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