2010-06-15 37 views
6

Tôi (chỉ để cho vui) cố gắng triển khai dịch vụ web Điểm cao. Tôi muốn nó tương thích với các nguyên tắc REST. Tôi muốn có thể thêm điểm cao mới bằng cách sử dụng thông số url như thế này http://mydomain.com/hs/add&name=John&score=987. Theo REST, điều này phải được thực hiện bằng cách sử dụng một yêu cầu POST. Điều này dẫn đến yêu cầu POST trống với tất cả dữ liệu có trong thông số URL. Đây có phải là hành vi không tốt?URL được mã hóa POST thực hành xấu?

Cập nhật
Bảo mật hiện không phải là mối lo ngại lớn.

+1

Nó không thực sự quan trọng, nơi bạn đặt các biến ... cho dù trong một GET, POST GET-like hoặc POST sản, một người dùng thông minh có thể thao tác các điểm cao trong vài phút. Xem xét một số dạng mã hóa (khóa công khai; RSA?) Cho một giải pháp an toàn (thực tế). – MvanGeest

+0

Bạn có thể có nghĩa là 'http: //mydomain.com/hs/add? Name = John & score = 987', xem phần 3.3 của RFC 1738: http://www.faqs.org/rfcs/rfc1738.html – Artefacto

Trả lời

12

Cách phổ biến để làm điều đó sẽ được gửi một POST để http://mydomain.com/hs/add với nội dung:

name=John&score=987 (cho đơn giản dữ liệu được mã hóa url, sẽ khác với dữ liệu được mã hóa nhiều phần, định dạng của cơ thể yêu cầu POST là tùy ý và nằm ngoài phạm vi của các đề xuất REST - thậm chí nó có thể là dữ liệu được mã hóa tùy ý, như những người khác đã đề xuất).

Yêu cầu GET để thêm điểm cao mới sẽ không chỉ là vi phạm nguyên tắc REST, mà còn vi phạm RFC 2616, yêu cầu các yêu cầu GET phải không có giá trị.

EDIT

Có thực hành xấu để truyền dữ liệu trong chuỗi truy vấn và đăng một cơ thể trống rỗng?

Có. URL phải mô tả tài nguyên đang phải chịu tác vụ được mô tả bằng phương pháp HTTP. Do đó, có lẽ tùy chọn tốt nhất sẽ là có một URL và cho phép cơ thể mô tả hoàn toàn hành động.

Chuỗi truy vấn có thể có thể được sử dụng để hội đủ điều kiện tiếp tục yêu cầu mà không có một cơ thể, ví dụ .:

http://mydomain.com/hs?period=lastmonth (GET)

+0

Tôi không chắc chắn cách này trả lời câu hỏi. Nếu tôi đọc nó đúng, câu hỏi là: Thực hành không tốt để truyền dữ liệu trong chuỗi truy vấn và đăng một nội dung rỗng? –

+0

OK, tôi sẽ chỉnh sửa câu trả lời để giải quyết vấn đề đó. – Artefacto

+0

Cảm ơn câu trả lời chi tiết và hữu ích (đặc biệt là chỉnh sửa). – StackedCrooked

0

Rất tệ .. người dùng có thể thao túng điểm số. Bạn nên áp dụng một số loại mã hóa, ngay cả khi nó đơn giản, trước khi nộp điểm số thông qua querystring

+2

Sử dụng đúng POST sẽ chỉ làm cho nó khó khăn hơn. Các giải pháp thực sự có thể là một loại mã hóa, nhưng đó không phải là những gì người dùng đang yêu cầu. – MvanGeest

+1

Ngay cả với giá trị POST, thật dễ dàng để thao tác dữ liệu đó .. – poke

0

GET nên được sử dụng khi thu thập dữ liệu. Khi thêm hoặc thao tác dữ liệu, bạn nên luôn sử dụng POST.

Bằng cách đó người dùng sẽ không:

  • Vô tình đi đến url một lần nữa và làm cho tất cả dữ liệu của bạn bẩn
  • Cố thay đổi cơ sở dữ liệu của bạn
2

Bạn sử dụng một dấu chấm hỏi trước các thông số, vì vậy nó sẽ là: http://mydomain.com/hs/add?name=John&score=987. Tuy nhiên, ý tưởng là URL phải là tên của tài nguyên và phương thức yêu cầu nên quyết định việc cần làm.

Vì vậy, URL chính xác sẽ chỉ là http://mydomain.com/hs và bạn sẽ gửi thông số trong dữ liệu POST thay thế. Vì đó là một yêu cầu POST, nó sẽ thêm dữ liệu vào tài nguyên.

+0

Tại sao downvote? Nếu bạn không giải thích những gì bạn không thích, nó không thể cải thiện câu trả lời. – Guffa

0

Sử dụng POST yêu cầu để ngăn chặn sau tình huống:

  • tài log-in
  • trình duyệt web lưu thông tin xác thực giữa phiên
  • tài khoản nhận được ví dụ một email với HTML chứa thẻ như < img src = 'http://mydomain.com/hs/add?name=John&score=987' .../>
  • Ứng dụng thư cố gắng tải xuống hình ảnh, tự động sử dụng thông tin đăng nhập được lưu trữ trong trình duyệt web và thêm hoặc xóa inf ormation từ/đến hệ thống của bạn âm thầm.
1

Không, việc sử dụng thông số url trong POST không phải là hành vi không tốt như REST liên quan. Điều này có vẻ là một cách tiếp cận hoàn toàn hợp lệ với tôi.

Từ góc độ thẩm mỹ tôi sẽ đề nghị một địa chỉ như

POST http://mydomain.com/highscores?name=John&score=987 
Các vấn đề liên quan