【问题标题】:Postman able to use GET request properly but my program cannot邮递员能够正确使用 GET 请求,但我的程序不能
【发布时间】:2018-07-18 10:58:41
【问题描述】:

我在下面构建了一个 GET 和 PUT 请求:

    from flask import Flask
from flask_restful import Api, Resource, reqparse

app = Flask(__name__)
api = Api(app)

userStorage =[
    {
        "id": "1234",
        "currentBot": "BestBot"
    }
]

class User(Resource):
    def get(self, id):
        for user in userStorage:
            if(id == user["id"]):
                return user, 200
        return "User not found", 404

    def put(self, id):
        parser = reqparse.RequestParser()
        parser.add_argument("currentBot")
        args = parser.parse_args()

        for user in userStorage:
            if(id == user["id"]):
                user["currentBot"] = args["currentBot"]
                return user, 200

        user = {
            "id": id,
            "currentBot": args["currentBot"]
        }
        userStorage.append(user)
        return user, 201

    def delete(self, id):
        global userStorage
        userStorage = [user for user in userStorage if user["id"] != id]
        return "{} is deleted.".format(id), 200

api.add_resource(User, "/user/<string:id>")

app.run(debug = True, port = 4000)

当我执行简单的获取请求时,邮递员可以正确地得到响应 200,但是当我尝试通过自己的程序执行请求时,它会返回 404

import requests

payload2Storage = {
    "currentBot": "BestBot"
}

headers = {"Content-Type": "application/json"}


params = {
    "id": "1234"
}


#response = requests.request("PUT", "http://127.0.0.1:4000/user/", data=payload2Storage, params=params, headers=headers)

response2 = requests.request("GET", "http://127.0.0.1:4000/user/", params=params, headers=headers)

我从 userStorage 获取信息的请求有问题吗?

【问题讨论】:

    标签: python-3.x rest python-requests postman


    【解决方案1】:

    在客户端代码中,从 127.0.0.1 更改为 localhost 对我有用。试试这个:

    response2 = requests.request("GET", "http://localhost:4000/user/", params=params, headers=headers)
    

    或者在服务器代码中,通过主机参数将服务器显式绑定到 127.0.0.1,如下所示:

    app.run(debug = True, port = 4000, host='127.0.0.1')
    

    代码中的其他错误是 user["id"] 返回一个 str 而 id 是一个 int,更改代码如下:

    def get(self, id):
        for user in userStorage:
            if(id == int(user["id"])):
                return user, 200
        return "User not found", 404
    

    【讨论】:

    • 它仍然返回 404。我注意到它在 URL 中创建了一个查询字符串请求,所以 URL 看起来像这样:/user/?id=1234 HTTP/1.1" 404 -。我注意到如果我只是将 id 直接插入 url 没有“?id =”它实际上有效。这会是导致这种情况的行吗? api.add_resource(User, "/user/") (原始服务器代码sn-p)
    • 做这个改变api.add_resource(User, "/user/&lt;int:id&gt;")
    • 仍然返回 404? '127.0.0.1 - - [19/Jul/2018 11:57:40] "GET /user/?id=1234 HTTP/1.1" 404 -'
    • 这里有一个差异:在您的服务器程序中,您期望 id 作为路径参数,即api.add_resource(User, "/user/&lt;int:id&gt;"),而从您的请求中,您将其作为查询参数发送,因此 404。将您的客户端更改为有这个response2 = requests.request("GET", "http://localhost:4000/user/1234", params=params, headers=headers)
    • 我知道你来自哪里。但是 id 是参数。我如何告诉它把 id 作为查询参数,因为 id 是灵活的并且可以根据被搜索的用户而改变?
    猜你喜欢
    • 1970-01-01
    • 2019-08-25
    • 2019-01-07
    • 1970-01-01
    • 2018-11-23
    • 2020-11-08
    • 2019-08-28
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多