Apakah dianggap praktik yang buruk untuk melakukan HTTP POST tanpa badan entitas?

177

Saya perlu menjalankan proses yang tidak memerlukan input dari pengguna, hanya pemicu. Saya berencana untuk menggunakan POST / uri tanpa badan untuk memicu proses. Saya ingin tahu apakah ini dianggap buruk dari perspektif HTTP dan REST?

Suresh Kumar
sumber
6
Terima kasih semua untuk saran Anda. Meskipun semua orang memberikan saran yang sama yaitu POST dengan konten nol, saya memilih jawaban Darrel sebagai benar karena tautan ke diskusi IETF. Diskusi banyak menjelaskan.
Suresh Kumar

Jawaban:

155

Saya mengajukan pertanyaan ini pada kelompok kerja HTTP IETF beberapa bulan yang lalu. Jawaban singkatnya adalah: TIDAK, ini bukan praktik yang buruk (tapi saya sarankan membaca utas untuk lebih jelasnya).

Darrel Miller
sumber
4
Adakah sumber yang diperbarui yang akan mengonfirmasi hal itu 10 tahun kemudian?
Baptiste Pernet
79

Menggunakan POST bukannya GET sangat masuk akal, karena juga menginstruksikan server (dan gateway sepanjang jalan) untuk tidak mengembalikan respons yang di-cache.

Adam Vandenberg
sumber
50

POST sepenuhnya OK. Perbedaan GET dengan POST Anda mengubah keadaan sistem (kemungkinan besar pemicu Anda adalah "melakukan" sesuatu dan mengubah data).

Saya sudah menggunakan POST tanpa payload dan "rasanya" OK. Satu hal yang harus Anda lakukan ketika menggunakan POST tanpa payload: Pass header Content-Length: 0. Saya ingat masalah dengan beberapa proksi ketika saya api-client tidak lulus.

manuel aldana
sumber
16

Jika Anda menggunakan POST / uri tanpa badan, itu seperti menggunakan fungsi yang tidak mengambil argumen .eg int post (void); jadi masuk akal untuk memiliki fungsi untuk kelas sumber daya Anda yang dapat mengubah keadaan suatu objek tanpa argumen. Jika Anda mempertimbangkan untuk menerapkan fungsi sentuh Unix untuk URI, bukankah itu pilihan yang baik?

yadab
sumber
6
Sentuh / jari adalah ilustrasi buku teks dari tindakan non-idempoten yang pada dasarnya tidak mengandung konten.
Chris Marisic
2

Ya, tidak apa-apa untuk mengirim permintaan POST tanpa isi dan alih-alih menggunakan parameter string kueri. Tapi hati-hati jika parameter Anda mengandung karakter yang tidak valid HTTP, Anda harus menyandikannya.

Misalnya jika Anda perlu POST 'hello world' ke dan titik akhir Anda harus membuatnya terlihat seperti ini: http://api.com?param=hello%20world

marko982
sumber
0

Dukungan untuk jawaban bahwa POST OK dalam hal ini adalah bahwa dalam kasus Python, kerangka kerja OpenAPI "FastAPI" menghasilkan GUI Swagger (lihat gambar) yang tidak berisi bagian Tubuh ketika metode (lihat contoh di bawah) tidak memiliki parameter untuk menerima tubuh.

metode "post_disable_db" hanya menerima parameter path "db_name" dan tidak memiliki parameter ke-2 yang akan menyiratkan badan wajib.

@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

masukkan deskripsi gambar di sini

RaamEE
sumber