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?
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?
Jawaban:
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).
Menggunakan POST bukannya GET sangat masuk akal, karena juga menginstruksikan server (dan gateway sepanjang jalan) untuk tidak mengembalikan respons yang di-cache.
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.
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?
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
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