簡體   English   中英

Restful Web 服務 [PUT 請求]

[英]Restful Web Services [PUT Request]

我正在尋找使用 PUT 請求更新資源的問題

這是請求: METHOD PUT => http://localhost:8081/user/int:id

正文 => {“電子郵件”:“abc@bmail.com”}

Req.json.matching 用於循環 i 是索引

並且響應應該是:

a) 如果列表中存在具有匹配 id 的用戶:

http 狀態碼 200 {“消息”:“用戶已成功更新!”}

b)如果列表中不存在具有匹配id的用戶:http狀態碼404

{“消息”:“用戶不存在!”}

以下是我從 web 自行研究后嘗試的代碼:

from flask import Flask,jsonify,request
app = Flask (__name__)

users=[{"userid":1,"username":"John","email":"john@gmailer.com","role":"member","password":"abc123"}]

@app.route('/users/<int:id>',methods=["PUT"])
def updateUser(userid):

    id = [user for user in users if (users['userid'] == userid)]

    if 'userid' in request.json:
        id[0]['userid'] = request.json['userid']

    if 'email' in request.json:
        id[0]['email'] = request.json['email']

    return jsonify({'user':id[0]})



if __name__ == '__main__':
        app.run(debug=True) #server will auto-restart when we save our changes to the code 

我無法得到想要的結果。 任何幫助表示贊賞。

首先,您的要求與代碼的實際功能存在相當多的不匹配。 我想出了一個代碼片段,我認為它非常符合您的要求,但我還有一些未解決的問題。 我會在答案的末尾列出它們,以防我做出錯誤的假設。

from flask import Flask, jsonify, request, abort

app = Flask(__name__)

users = [{"userid": 1, "username": "John", "email": "john@gmailer.com", "role": "member", "password": "abc123"}]


@app.route('/users/<int:userid>', methods=["PUT"])
def updateUser(userid):
    for user in users:
        if user["userid"] == userid:
            if 'userid' in request.json:
                user['userid'] = request.json['userid']
            if 'email' in request.json:
                user['email'] = request.json['email']
            return jsonify({'user': user})
    abort(404)


if __name__ == '__main__':
    app.run(debug=True)

您的代碼中有一些奇怪的東西:

  • 您永遠不應該隱藏內置名稱:名稱id是 python 內置名稱。 在某些情況下,這可能會導致無法預料的事情。
  • id變量的列表理解中有一個錯字:它說users['userid'] ,但它應該是user['userid'] (注意代碼中的復數“s”)。
  • 該方法需要一個參數userid ,但路由將參數定義為id ( '/users/<int:id>' )。 它也應該是'/users/<int:userid>'
  • 您不需要列表理解,只需遍歷列表,一旦找到您的用戶,您就可以完成任務並返回。
  • 當找不到用戶時,您的代碼對錯誤情況沒有邏輯。 在我的示例代碼中查看我如何循環用戶以及當我退出循環時,這意味着我沒有找到用戶,我調用abort 它取消請求並返回錯誤代碼(在本例中為 404)。
  • 默認情況下 flask 使用端口 5000,因此您對端口 8081 的 put 請求將不起作用,但我猜這是由於將代碼復制到堆棧溢出中。
  • 您真的要允許更新用戶標識嗎? 問題中沒有提到這一點,通常在后端代碼中這樣的事情不是一個好主意,因為 id 是您的唯一標識符。 如果它被更改並且用戶將其更改為已經存在的代碼,則您的代碼可能會導致奇怪的行為。
  • 在您的問題中,您說您想在成功的情況下返回200 {“message”: “User with has been successfully updated!”} ,但您的代碼會返回更新后的用戶。 我不確定在這里選擇哪個選項,所以我一直在返回用戶。

這是相當多的信息,但我想提供您代碼中的所有發現。 也許它可以幫助你,你可以從中學到一些東西:) 如果它仍然沒有按預期工作,請在下面發表評論和/或更新你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM