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?
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?
Odpowiedzi:
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).
Użycie POST zamiast GET jest całkowicie rozsądne, ponieważ instruuje również serwer (i bramy po drodze), aby nie zwracał buforowanej odpowiedzi.
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ł.
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?
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
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