Python cURL命令返回400错误请求错误

Python cURL命令返回400错误请求错误,python,postgresql,curl,flask,flask-sqlalchemy,Python,Postgresql,Curl,Flask,Flask Sqlalchemy,我使用postgres从postgres数据库获取数据。所以创建FlaskAPI,但当我使用curl命令时,它会返回400个错误请求错误。 这是我的密码- from flask import Flask, render_template, request, Response import psycopg2 import csv import json from psycopg2.extras import RealDictCursor import requests conn = psycop

我使用postgres从postgres数据库获取数据。所以创建FlaskAPI,但当我使用curl命令时,它会返回400个错误请求错误。 这是我的密码-

from flask import Flask, render_template, request, Response
import psycopg2
import csv
import json
from psycopg2.extras import RealDictCursor
import requests

conn = psycopg2.connect("host='localhost' dbname='postgres' user='postgres'")
app = Flask(__name__)

@app.route('/', methods = ['GET','POST'])
def index():
    cur = conn.cursor(cursor_factory=RealDictCursor)
    query = request.form['query']
    cur.execute(query)
    return Response(json.dumps(cur.fetchall(),indent=2),mimetype='application/json')

if __name__ == "__main__":
   app.run(host='0.0.0.0')

conn.close()
我使用这个curl命令-

curl -H "Content-Type: application/json" -X GET http://127.0.0.1:5000/ -d '{"query":"SELECT COUNT(*) FROM usage"}'
那么如何将curl与FlaskAPI结合使用呢

免责声明: 您有直接SQL注入。我建议你修理一下

答复: 请求不是这样工作的。如果要在
curl
中传递数据,则需要将参数格式化为查询字符串。它不会为您解码JSON。你有几个选择

固定卷曲: (注意,我将参数编码在每一个参数中)

重新格式化curl以使用GET参数:

curl 'http://127.0.0.1:5000/?query=SELECT%20COUNT(*)%20FROM%20usage'
按预期将curl重新格式化为POST:

curl -H "Content-Type: application/json" -X POST http://127.0.0.1:5000/ -d 'query=SELECT%20COUNT(*)%20FROM%20usage'
这将让您在编写时获得上面的数据

解析JSON 这将让您在编写卷曲时继续使用卷曲:

# this is the short version, provided by randomir in the comments.
query = request.json().get('query')

# This is an alternative which roughly does the same thing
dat_str = request.data
dat_dict = json.loads(dat_str)
query = dat_dict['query']

在第二个示例中不需要
-xget
,因为
-d
默认为
POST
,OP的端点已经处理了
POST
方法。此外,无需设置
应用程序/json
内容类型标题。此外,无需手动编码查询,只需使用
--data urlencode
代替
-d
。当示例发送无效的json数据时,解析json有什么意义?顺便说一句,如果您真的想阅读JSON正文,您只需要
query=request.JSON().get('query')
curlhttp://127.0.0.1:5000/ --数据urlencode query='SELECT COUNT(*)FROM usage'
就是您所需要的。它将使用
application/x-www-form-urlencoded
内容类型执行
POST
请求。您的端点已经需要表单数据和
POST
方法。