Được coi là thực hành xấu để thực hiện HTTP POST mà không có thực thể?


176

Tôi cần phải gọi một quy trình không yêu cầu bất kỳ đầu vào nào từ người dùng, chỉ cần một trình kích hoạt. Tôi dự định sử dụng POST / uri mà không có cơ thể để kích hoạt quy trình. Tôi muốn biết liệu điều này có bị coi là xấu từ cả hai quan điểm HTTP và REST không?


6
Cảm ơn mọi người vì những gợi ý của bạn. Mặc dù mọi người đều đưa ra đề nghị tương tự, tức là không sao để POST với nội dung bằng 0, tôi đang chọn câu trả lời của Darrel là chính xác do liên kết đến cuộc thảo luận của IETF. Các cuộc thảo luận làm rõ rất nhiều.
Suresh Kumar

Câu trả lời:


154

Tôi đã hỏi câu hỏi này trên nhóm làm việc HTTP IETF vài tháng trước. Câu trả lời ngắn gọn là: KHÔNG, đó không phải là một thực hành tồi (nhưng tôi khuyên bạn nên đọc chủ đề để biết thêm chi tiết).


3
Bất kỳ nguồn cập nhật nào sẽ xác nhận rằng 10 năm sau?
Baptiste Pernet

79

Sử dụng POST thay vì GET là hoàn toàn hợp lý, vì nó cũng hướng dẫn máy chủ (và các cổng trên đường đi) không trả về phản hồi được lưu trong bộ nhớ cache.


50

POST là hoàn toàn OK. Khác với GET với POST, bạn đang thay đổi trạng thái của hệ thống (rất có thể trình kích hoạt của bạn đang "làm" một cái gì đó và thay đổi dữ liệu).

Tôi đã sử dụng POST mà không có tải trọng và nó "cảm thấy" OK. Một điều bạn nên làm khi sử dụng POST mà không tải trọng: Truyền tiêu đề Content-Length: 0. Tôi nhớ các vấn đề với một số proxy khi tôi api-client không vượt qua nó.


16

Nếu bạn sử dụng POST / uri mà không có phần thân thì nó giống như sử dụng hàm không lấy tham số .eg int post (void); Vì vậy, thật hợp lý khi có chức năng cho lớp tài nguyên của bạn, có thể thay đổi trạng thái của một đối tượng mà không cần phải có đối số. Nếu bạn xem xét để triển khai chức năng cảm ứng Unix cho URI, thì đó có phải là lựa chọn tốt không?


6
Chạm / ngón tay là một minh họa trong sách giáo khoa về một hành động không bình thường vốn không có nội dung.
Chris Marisic

2

Có, bạn có thể gửi yêu cầu POST mà không cần phần thân và thay vào đó sử dụng các tham số chuỗi truy vấn. Nhưng hãy cẩn thận nếu các tham số của bạn chứa các ký tự không hợp lệ HTTP, bạn sẽ phải mã hóa chúng.

Ví dụ: nếu bạn cần POST 'hello world' đến và điểm cuối, bạn sẽ phải làm cho nó trông như thế này: http://api.com?param=hello%20world


0

Hỗ trợ cho các câu trả lời mà POST vẫn ổn trong trường hợp này là trong trường hợp của Python, khung OpenAPI "FastAPI" tạo ra GUI Swagger (xem hình ảnh) không chứa phần Body khi một phương thức (xem ví dụ bên dưới) không có một tham số để chấp nhận một cơ thể.

phương thức "post_disable_db" chỉ chấp nhận tham số đường dẫn "db_name" và không có tham số thứ 2 có nghĩa là một cơ quan bắt buộc.

@router.post('/{db_name}/disable',
             status_code=HTTP_200_OK,
             response_model=ResponseSuccess,
             summary='',
             description=''
             )
async def post_disable_db(db_name: str):
    try:
        response: ResponseSuccess = Handlers.databases_handler.post_change_db_enabled_state(db_name, False)
    except HTTPException as e:
        raise (e)
    except Exception as e:
        logger.exception(f'Changing state of DB to enabled=False failed due to: {e.__repr__()}')
        raise HTTPException(HTTP_500_INTERNAL_SERVER_ERROR, detail=e.__repr__())

    return response

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.