Przed faktycznie odpowiadając na pytanie:
parametrów w adresie URL (np key=listOfUsers/user1
) są GET
parametry i nie należy używać ich do POST
żądań. Szybkie wyjaśnienie różnicy między GET i POST można znaleźć here.
W twoim przypadku, aby skorzystać z zasadami REST, powinieneś mieć:
http://ip:5000/users
http://ip:5000/users/<user_id>
Następnie na każdym adresie URL, można zdefiniować zachowanie różnych metod HTTP (GET
, POST
, PUT
, DELETE
). Na przykład, na /users/<user_id>
, chcesz, co następuje:
GET /users/<user_id> - return the information for <user_id>
POST /users/<user_id> - modify/update the information for <user_id> by providing the data
PUT - I will omit this for now as it is similar enough to `POST` at this level of depth
DELETE /users/<user_id> - delete user with ID <user_id>
Tak w przykładzie, chcesz zrobić POST
do /users/user_1
z danymi POST będąc "John"
. Następnie wyrażenie XPath lub jakikolwiek inny sposób uzyskania dostępu do danych powinien być ukryty przed użytkownikiem, a nie ściśle powiązany z adresem URL. W ten sposób, jeśli zdecydujesz się zmienić sposób przechowywania i dostępu do danych, zamiast zmieniania adresu URL, będziesz musiał po prostu zmienić kod po stronie serwera.
Teraz odpowiedź na swoje pytanie: Poniżej jest podstawowym semi-pseudokod, w jaki sposób można osiągnąć to, co wspomniałem powyżej:
@app.route('/users/<user_id>', methods = ['GET', 'POST', 'DELETE'])
def user(user_id):
if request.method == 'GET':
"""return the information for <user_id>"""
.
.
.
if request.method == 'POST':
"""modify/update the information for <user_id>"""
# you can use <user_id>, which is a str but could
# changed to be int or whatever you want, along
# with your lxml knowledge to make the required
# changes
data = request.form # a multidict containing POST data
.
.
.
if request.method == 'DELETE':
"""delete user with ID <user_id>"""
.
.
.
else:
# POST Error 405 Method Not Allowed
.
.
.
Istnieje wiele innych rzeczy do rozważenia jakby POST
Żądaj typu zawartości, ale myślę, że to, co powiedziałem do tej pory, powinno być rozsądnym punktem wyjścia. Wiem, że nie odpowiedziałem bezpośrednio na dokładne pytanie, które zadawałeś, ale mam nadzieję, że ci to pomoże. Później wprowadzę pewne zmiany/dodatki.
Dzięki i mam nadzieję, że to będzie pomocne. Proszę, daj mi znać, jeśli popełniłem błąd.
masz zrobić coś specjalnego dla testu POST, aby prawidłowo kierowane z powrotem?Mam/competitions/ skonfigurowany, ale kiedy pojawi się POST, wysyła on do/competitions, więc moja logika obsługi postów nigdy nie zostanie osiągnięta. –