Varlık gövdesi olmadan HTTP POST gerçekleştirmek kötü bir uygulama mıdır?


176

Kullanıcıdan herhangi bir girdi gerektirmeyen bir işlemi çağırmam gerekiyor, sadece bir tetikleyici. İşlemi tetiklemek için POST / uri'yi bir gövde olmadan kullanmayı planlıyorum. Bunun hem HTTP hem de REST perspektifinden kötü kabul edilip edilmediğini bilmek istiyorum?


6
Önerileriniz için herkese teşekkürler. Herkes benzer bir öneri vermiş olsa da, sıfır içerikli POST için sorun olmamasına rağmen, IETF tartışmasına bağlantı nedeniyle Darrel'in cevabını doğru seçiyorum. Tartışma çok netleşiyor.
Suresh Kumar

Yanıtlar:


155

Bu soruyu birkaç ay önce IETF HTTP çalışma grubunda sordum . Kısa cevap: HAYIR, kötü bir uygulama değil (ancak daha fazla ayrıntı için konuyu okumanızı öneririz).


4
Bunu 10 yıl sonra teyit edecek herhangi bir güncellenmiş kaynak?
Baptiste Pernet

79

Bir GET yerine bir POST kullanmak son derece makuldür, çünkü sunucuya (ve yol boyunca ağ geçitlerine) önbelleğe alınmış bir yanıt döndürmemesini de bildirir.


50

POST tamamen iyi. POST ile GET farkından dolayı sistemin durumunu değiştiriyorsunuzdur (büyük olasılıkla tetikleyiciniz bir şey "yapıyor" ve veri değiştiriyor).

Ben zaten yük olmadan POST kullandım ve "hissediyor" Tamam. Yükü olmayan POST kullanırken yapmanız gereken bir şey: Üstbilgiyi geçin Content-Length: 0. Api-client bunu geçmediğimde bazı proxy'lerle ilgili sorunları hatırlıyorum.


16

Eğer beden olmadan POST / uri kullanırsanız, .eg int post (void); bu nedenle, kaynak sınıfınızda, bağımsız değişken olmadan bir nesnenin durumunu değiştirebilecek bir işleve sahip olmanız mantıklıdır. Bir URI için Unix dokunma işlevini uygulamayı düşünüyorsanız, iyi bir seçim değil mi?


6
Dokunma / parmak, doğası gereği içerik içermeyen, idempotent olmayan bir eylemin ders kitabı örneğidir.
Chris Marisic

2

Evet, gövde olmadan bir POST isteği göndermek ve bunun yerine sorgu dizesi parametrelerini kullanmakta sorun yoktur. Ancak parametreleriniz HTTP geçerli olmayan karakterler içeriyorsa, bunları kodlamanız gerekir.

Örneğin, 'merhaba dünyasını' POST yapmanız ve bitiş noktanızın POST olması gerektiği gibi yapmanız gerekir: http://api.com?param=hello%20world


0

Bu durumda POST'un uygun olduğu yanıtlar için destek, Python'un durumunda, "FastAPI" OpenAPI çerçevesinin, bir yöntem (aşağıdaki örneğe bakın) olmadığında Gövde bölümü içermeyen bir Swagger GUI (resme bakın) oluşturmasıdır. bir vücudu kabul etmek için bir parametreye sahip olmak.

"post_disable_db" yöntemi sadece "db_name" yol parametresini kabul eder ve zorunlu bir gövdeyi ima eden 2. parametreye sahip değildir.

@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

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.