エンティティボディなしでHTTP POSTを実行することは悪い習慣と考えられていますか?


176

ユーザーからの入力を必要としないプロセスを起動する必要があります。トリガーのみです。ボディなしでPOST / uriを使用してプロセスをトリガーする予定です。HTTPとRESTの両方の観点からこれが悪いと考えられるかどうか知りたいですか?


6
皆さんの提案に感謝します。誰もが同じような提案をしましたが、つまりコンテンツがゼロのPOSTで問題ありませんが、IETFディスカッションへのリンクがあるため、Darrelの回答を正しいものとして選択しています。議論は多くを明らかにします。
Suresh Kumar、

回答:


154

私は数か月前にIETF HTTPワーキンググループでこの質問をしました。短い答えは次のとおりです。いいえ、それは悪い習慣ではありません(ただし、詳細についてはスレッドを読むことをお勧めします)。


3
10年後にそれを確認する更新されたソースはありますか?
バプティストペルネ

79

GETの代わりにPOSTを使用することは、キャッシュされた応答を返さないようにサーバー(および途中のゲートウェイ)に指示するため、完全に合理的です。


50

POSTは完全にOKです。GETとPOSTの違いは、システムの状態を変更していることです(ほとんどの場合、トリガーは何かを「実行」してデータを変更しています)。

ペイロードのないPOSTをすでに使用しており、「感じ」OKです。ペイロードなしでPOSTを使用する場合にすべきことの1つは、ヘッダーの受け渡しContent-Length: 0です。api-clientが渡さなかったときのプロキシの問題を覚えています。


16

ボディなしでPOST / uriを使用する場合、引数を取らない関数を使用するようなものです。.eg int post(void); そのため、引数なしでオブジェクトの状態を変更できる関数をリソースクラスに持たせるのが妥当です。URIにUnixタッチ機能を実装することを検討している場合、それは良い選択ではありませんか?


6
タッチ/指は、本質的に内容を含まない、べき等ではないアクションの教科書イラストです。
Chris Marisic

2

はい、本文なしでPOSTリクエストを送信し、代わりにクエリ文字列パラメーターを使用することは問題ありません。ただし、パラメーターにHTTP有効ではない文字が含まれている場合は、それらをエンコードする必要があるので注意してください。

たとえば、「hello world」をエンドポイントにPOSTする必要がある場合は、次のようにする必要があります。http//api.com?param = hello %20world


0

この場合POSTがOKであるという回答のサポートは、Pythonの場合、OpenAPIフレームワーク「FastAPI」が、メソッド(以下の例を参照)が含まれていない場合に、Bodyセクションを含まないSwagger GUI(画像を参照)を生成することです。ボディを受け入れるパラメータがあります。

メソッド「post_disable_db」は、パスパラメータ「db_name」を受け入れるだけで、必須の本体を意味する2番目のパラメータはありません。

@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

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.