使用 curl 到 POST 并更新多个数据

Using curl to POST and update multiple data

我看到很多人问过这个问题,但这些问题与使用 txt 文件或表单中的数据有关。 在使用 json 文件时,我可以对 POST 数据使用 curl,但我想知道如何通过手动将数据添加到 curl 语句中来做到这一点。我还尝试在 curl 语句中使用 PUT,但也无法正常工作。我看了很多问题,但大多数只使用 ID 之类的东西,我正在尝试 POST 并放入 3 个东西。我还尝试对语句中的数据进行一些小的更改,但它们不断给我不同的错误,例如括号错位。请帮助这个初学者 U_U

我在数据库中发帖的curl语句是。

curl -X POST -d '{"todo_ID":18,"UserID":6,"details":"Stop putting in the same things"}' -H "Content-Type:application/
json" http://127.0.0.1:5000/

它说这个错误,我尝试进行更改但仍然出现相同的错误。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.<
/p>

使用 PUT 时,我的 curl 语句是

curl -X PUT -H "Content-Type:applicat
ion/json" -d {"todo_ID":1,"UserID": 3,"details":"hi let it go"} http://127.0.0.1
:5000/update/1

我基本上得到了与 POST.

相同的错误

我的代码是。

from flask import Flask, jsonify,json, request, abort
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_pyfile('Config.py')
db = SQLAlchemy(app)

class JsonModel(object): #Class for making objects JSON serializable
    def as_dict(self):
        return {c.name: getattr(self, c.name) for c in self.__table__.columns}

class User(db.Model, JsonModel): #Class which is a model for the User table in the database
    User_ID = db.Column(db.Integer, primary_key = True)
    FirstName = db.Column(db.String(20))
    LastName = db.Column(db.String(20))

    def __init__(self,User_ID,FirstName, LastName):
        self.User_ID = User_ID
        self.FirstName = FirstName
        self.LastName = LastName

class Todo(db.Model, JsonModel):    #Class which is a model for the Todo table in the database
    todo_ID = db.Column(db.Integer, primary_key = True)
    UserID = db.Column(db.Integer, db.ForeignKey("user.User_ID"))
    details = db.Column(db.String(30))

    def __init__(self,todo_ID, UserID,details):
        self.todo_ID = todo_ID
        self.UserID = UserID
        self.details = details

@app.route('/', methods = ['POST'])  #Uses POST method with same URL as GET method to add new information to Todo table.
def create_dev():
    dev = Todo(request.json["todo_ID"], request.json["UserID"], request.json["details"])
    db.session.add(dev)
    db.session.commit()
    return json.dumps([{'dev': dev}]), 201

@app.route('/update/<int:todo_ID>', methods = ['PUT'])
def update_todo(todo_ID):
    dev = Todo.query.get(todo_ID)
    dev.UserID = Todo(request.json["UserID"])
    dev.details = Todo(request.json["details"])
    db.session.update(dev)
    db.session.commit()
    return jsonify( { 'dev': dev})

@app.before_first_request #Creates everything before the first request.
def startup():
    db.create_all()

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

400 Bad Requests 通常在您尝试从不存在的请求中访问某些数据时看到。

在你的情况下,当你第一次尝试从你的请求中读取 request.json["todo_ID"] 时,它可能会失败,因为 Flask 无法正确解码你的 json。

现在,使用 curl 可能有点麻烦 json(查看有关该主题的其他 SO 问题)。最简单的测试方法是创建一个 example.json 文本文件,其内容为:

{
    "todo_ID":18,
    "UserID":6,
    "details":"Stop putting in the same things"
}

然后通过 运行 curl -H "Content-Type: application/json" -X POST -d @example.json http://127.0.0.1:5000/

调整您的 curl 命令以使用该文件而不是处理字符串本身

您的问题应该会消失。