【问题标题】:cURL command return the 400 Bad request errorcURL 命令返回 400 Bad request 错误
【发布时间】:2017-11-20 13:28:25
【问题描述】:

我使用 postgres 从 postgres 数据库中获取数据。所以创建烧瓶 api 但是当我使用 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 和烧瓶 api。

【问题讨论】:

  • curl http://127.0.0.1:5000/ --data-urlencode query='SELECT COUNT(*) FROM usage' 就是您所需要的。它将使用 application/x-www-form-urlencoded 内容类型执行 POST 请求。您的端点已经需要表单数据和 POST 方法。

标签: python postgresql curl flask flask-sqlalchemy


【解决方案1】:

免责声明:

您有直接的 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

这将让您在编写 cURL 时继续使用它:

# 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']

【讨论】:

  • 第二个示例中不需要-X GET,因为-d 默认为POST,并且OP 的端点已经处理了POST 方法。此外,无需设置application/json 内容类型标头。
  • 另外,无需手动编码查询,只需使用--data-urlencode 代替-d
  • 当您的示例发送无效的 JSON 数据时,解析 JSON 的意义何在?顺便说一句,如果你真的想阅读 JSON 正文,你只需要query = request.json().get('query')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2018-10-08
相关资源
最近更新 更多