2012-06-18 38 views
18

Tôi muốn triển khai REST API và cần một cơ thể trên các yêu cầu GET của tôi. (Giống như được thảo luận ở đây: HTTP GET with request body)REST API: GET request with body

Có các ứng dụng khách http nào không thể gửi một phần nội dung có yêu cầu GET không? Fiddler có thể làm điều đó, mặc dù hộp thông báo có màu đỏ.

Trả lời

25

Theo nguyên tắc chung, ý tưởng về GET trong REST là bất kỳ thông số nào của bạn được gửi trong URL. Khi câu trả lời cho câu hỏi mà bạn đưa vào chỉ ra, nó có thể thực hiện được nhưng bỏ qua điểm REST, đó là có một giao diện webbish nhất quán. Nếu bạn muốn chuyển dữ liệu phức tạp đến điểm cuối của mình, có thể bạn muốn sử dụng POST, mà người dùng của bạn sẽ mong muốn có nội dung. Tôi khuyên bạn nên xem xét lại việc triển khai đó.

Nhưng đối với câu hỏi thực tế của bạn, chắc chắn có những khách hàng không thể gửi nội dung trên GET. Chủ yếu là tôi tưởng tượng khách hàng của bạn sẽ có lập trình, ví dụ, urlib2 của python và khi bạn có thể đặt cơ thể trên GET, nó không thực sự là mục đích sử dụng của mô-đun, vì vậy bạn buộc người lập trình trở nên kỳ quặc. Quan trọng hơn, ý tưởng về REST api là khách hàng bất khả tri, đó là lý do tại sao nó nghe với tôi giống như thiết kế API của bạn nên được làm lại ở đây.

+1

có điều này sẽ là sự lựa chọn thứ hai của tôi. Đúng là việc sử dụng một phần thân trên yêu cầu GET không hoàn toàn an toàn, nhưng nó cần thiết. Độ dài URL bị giới hạn và thường gặp sự cố với dữ liệu phức tạp. Nếu không có khả năng GET, tôi sẽ sử dụng POST, nhưng người dùng sẽ phát hiện POST để tạo và GET để truy xuất dữ liệu. Tuy nhiên, tôi không thấy lựa chọn nào khác. – user437899

+5

Tôi thấy điểm, nhưng tôi nghĩ rằng nó sẽ ít gây đột biến hơn cho người dùng để tưởng tượng điểm cuối POST như một nhà cung cấp dịch vụ đang xử lý dữ liệu XML/JSON phức tạp của họ và phản hồi kết quả, hơn là tạo ra một tiêu chuẩn không GET yêu cầu. POST thường được sử dụng theo cách này, GET thì không. – Ben

9

Bạn nên sử dụng nội dung trong các yêu cầu GET HTTP. Có, có vẻ như rằng "de jure" HTTP GET có thể có nội dung, nhưng "thực tế", bạn sẽ gặp sự cố:

  1. Với khung/thư viện khách hàng. Sẽ rất khó để tìm được sự hỗ trợ của nó.
  2. Máy chủ chỉ có thể bỏ qua phần thân Yêu cầu GET. Và dù sao nó không phải là cách tiêu chuẩn, và có thể là vấn đề với máy chủ hoặc cấu hình của nó.
  3. Nó làm cho mã của bạn, đặc biệt là ở phía máy chủ, không rõ ràng cho người khác, bởi vì không ai mong đợi GET với cơ thể.

Bạn đang tìm kiếm một cách khó khăn? Với GET với cơ thể bạn sẽ có rất nhiều cạm bẫy. Tại sao không sử dụng động từ HTTP khác?

Ví dụ sử dụng POST (hoặc một số động từ khác), hơn:

  1. thật dễ dàng để có thư viện khách hàng đã sẵn sàng,
  2. không có vấn đề với máy chủ hoặc cấu hình máy chủ,
  3. thì rõ ràng để khác

Đừng tìm cách khó :)

+0

Bạn có thể biện minh cho "Và dù sao nó không phải là cách tiêu chuẩn", xin vui lòng. Bạn đang đề cập đến "tiêu chuẩn" nào? –

+1

Tôi đang tham chiếu các tiêu chuẩn HTTP và các giấy tờ RFC, ví dụ: http://tools.ietf.org/html/rfc2616. Các yêu cầu HTTP GET có thân là không chuẩn – Regfor

+2

Vâng, HTTP 1.1 dường như cho phép cơ thể thông báo cho các yêu cầu GET (không cấm nó): 'Một nội dung thư KHÔNG PHẢI được bao gồm trong yêu cầu nếu đặc tả của phương thức yêu cầu (phần 5.1.1) không cho phép gửi một thực thể-cơ thể trong yêu cầu.' Các đặc điểm kỹ thuật GET trong 5.1.1 dường như không "không cho phép". –