Czy wykonywanie HTTP POST bez treści jednostki jest uważane za złą praktykę?

176

Muszę wywołać proces, który nie wymaga żadnych danych wejściowych od użytkownika, a jedynie wyzwalacz. Planuję użyć POST / uri bez body, aby uruchomić proces. Chcę wiedzieć, czy jest to uważane za złe z punktu widzenia HTTP i REST?

Suresh Kumar
źródło
6
Dziękuję wszystkim za sugestie. Chociaż wszyscy dawali podobną sugestię, tj. POST jest w porządku z zerową zawartością, wybieram odpowiedź Darrela jako poprawną ze względu na link do dyskusji IETF. Dyskusja wiele wyjaśnia.
Suresh Kumar

Odpowiedzi:

155

Zadałem to pytanie w grupie roboczej IETF HTTP kilka miesięcy temu. Krótka odpowiedź brzmi: NIE, to nie jest zła praktyka (ale sugeruję przeczytanie wątku po więcej szczegółów).

Darrel Miller
źródło
4
Jakieś zaktualizowane źródło, które potwierdzi to 10 lat później?
Baptiste Pernet
79

Użycie POST zamiast GET jest całkowicie rozsądne, ponieważ instruuje również serwer (i bramy po drodze), aby nie zwracał buforowanej odpowiedzi.

Adam Vandenberg
źródło
50

POST jest całkowicie OK. W odróżnieniu od GET i POST zmieniasz stan systemu (najprawdopodobniej twój wyzwalacz "robi" coś i zmienia dane).

Użyłem POST już bez ładunku i „czuje się” OK. Jedna rzecz, którą powinieneś zrobić, używając POST bez ładunku: nagłówek Pass Content-Length: 0. Pamiętam problemy z niektórymi serwerami proxy, gdy klient api nie przeszedł.

manuel aldana
źródło
16

Jeśli używasz POST / uri bez treści, jest to coś w rodzaju funkcji, która nie przyjmuje argumentu .eg int post (void); więc rozsądne jest posiadanie funkcji do klasy zasobów, która może zmieniać stan obiektu bez argumentu. Jeśli rozważasz zaimplementowanie funkcji dotykowej Unix dla identyfikatora URI, czy nie jest to dobry wybór?

yadab
źródło
6
Dotyk / palec to podręcznikowa ilustracja nie idempotentnego działania, które jest z natury pozbawione treści.
Chris Marisic
2

Tak, można wysłać żądanie POST bez treści i zamiast tego użyć parametrów ciągu zapytania. Ale bądź ostrożny, jeśli twoje parametry zawierają znaki, które nie są poprawne przez HTTP, będziesz musiał je zakodować.

Na przykład, jeśli chcesz POST napisać „hello world” do punktu końcowego, powinien wyglądać tak: http://api.com?param=hello%20world

marko982
źródło
0

Wsparcie dla odpowiedzi, że POST jest OK w tym przypadku jest takie, że w przypadku Pythona, struktura OpenAPI "FastAPI" generuje GUI Swagger (patrz obrazek), który nie zawiera sekcji Body, gdy metoda (patrz przykład poniżej) nie mieć parametr do zaakceptowania treści.

metoda „post_disable_db” po prostu akceptuje parametr ścieżki „nazwa_db” i nie ma drugiego parametru, który sugerowałby treść obowiązkową.

@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

wprowadź opis obrazu tutaj

RaamEE
źródło