这是flask代码:
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def refresh():
params = {
'thing1': request.values.get('thing1'),
'thing2': request.values.get('thing2')
}
return json.dumps(params)
这是cURL
:
$ curl -XGET 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
> {"thing1": "1", "thing2": null}
$ curl -XGET 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
> {"thing1": "1", "thing2": null}
该文档似乎非常清楚这应该工作:
形成
包含来自POST或PUT请求的已解析表单数据的MultiDict。请记住,文件上传不会在此处结束,而是在files属性中结束。
args
具有查询字符串的已解析内容的MultiDict。(URL中问号后的部分)。
价值观
一个同时包含form和args内容的CombinedMultiDict。
有什么想法我做错了吗?
更新:尝试从答案之一中提出建议,换return行:
使用会return json.dumps(json.load(request.body.decode("utf-8") ))
产生错误AttributeError: 'Request' object has no attribute 'body'
使用会return json.dumps(json.load(request.json))
产生错误AttributeError: 'NoneType' object has no attribute 'read'
使用POST与原点代码出现没有任何效果:
$ curl -XPOST 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
{"thing1": "1", "thing2": null}
设置内容类型并POST与原始代码一起使用也没有明显的效果:
$ curl -XPOST -H "Content-Type: application/json" 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
{"thing1": "1", "thing2": null}
尽管我去验证了内容类型是否正确设置:
...
print(request.headers)
...
Host: 127.0.0.1:5000
User-Agent: curl/7.54.0
Accept: */*
Content-Type: application/json
Content-Length: 12
你无意间发送了错误的Content Type。
默认情况下,curl
的-d标志将发送content-type
的POST数据application/x-www-form-urlencoded
。由于你没有以期望的格式(key = value)发送数据,因此它将完全删除数据。对于JSON数据,你需要发送内容类型设置为application/json
如下的HTTP请求:
curl -XPOST -H "Content-Type: application/json" 'http://127.0.0.1:5000/?thing1=1' -d '{"thing2":2}'
另外,flask的request.form
字段仅包含POST表单数据,而不包含其他内容类型。你可以使用request.data
或更方便地使用解析的JSON数据访问原始POST请求主体request.get_json
。
下面是示例的固定版本:
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def refresh():
params = {
'thing1': request.values.get('thing1'),
'thing2': request.get_json().get('thing2')
}
return json.dumps(params)
app.run()
更新:我之前打错了 request.body
实际上应该是request.data
。事实证明request.json
它已被弃用,request.get_json
现在应改为使用。原始帖子已更新。
问题内容: 我正在尝试在Express中编写一个愚蠢的简单Hello World程序,该程序输出有关当前HTTP请求的一些基本数据。 对于POST请求,我想查看原始POST正文。 当我关闭来自邮递员的任何类型的POST请求时,设置为。为什么是空的?如何打印原始POST数据?我不需要POST正文的解析版本,只需原始数据即可。 问题答案: 为了读取发布请求的正文,您需要body-parser。 如果您
问题内容: 我似乎无法弄清楚如何使用WSGI访问POST数据。我在wsgi.org网站上尝试了该示例,但没有成功。我现在正在使用Python3.0。请不要推荐WSGI框架,因为这不是我想要的。 我想弄清楚如何将其放入fieldstorage对象。 问题答案: 假设您试图将POST数据仅获取到FieldStorage对象中:
如何通过JSTL将数据打印到页面? 在上图中,我正在向控制器发送一个帖子。现在我可以轻松地访问查询字符串参数,例如将打印出测试参数。 但我不确定如何访问请求有效载荷中的数据。我尝试了${requestScope}对象,但数据似乎不在那里。 我不知道有多相关,但我使用Angular的进行调用。
问题内容: 我有一个应用程序,它基本上是服务的代理。该应用程序本身是在Jersey上构建的,由Jetty提供。我有这个资源方法: 用户提交POST表单。所有POST请求都通过此方法。除了一个细节外,UriInfo和HttpServletRequest被适当地注入:似乎没有参数。这是我从终端发送的请求: 此处的POST正文显然包含两个参数:foo和biz。但是,当我尝试在代码()中获取它们时,结果是
我有一个应用程序,基本上是一个服务的代理。该应用程序本身是基于Jersey构建的,由Jetty提供服务。我有这个资源方法: 用户提交POST表单。所有POST请求都通过此方法。UriInfo和HttpServletRequest被适当地注入,除了一个细节:似乎没有参数。这是我从终端发送的请求: 这里,POST正文显然包含两个参数:foo和biz。但当我尝试在代码中获取它们时(),结果是一个大小为0
问题内容: 我的POST方法看起来像这样: 当我在Netbeans中创建Jersey客户时,调用post方法的方法如下所示: 运行此测试时: 它在服务器中提供以下输出: 我需要更改什么才能使参数给出正确的值? 问题答案: 你的方法应该接受JSON对象而不是字符串。Jersey使用JAXB支持封送和拆封JSON对象(有关详细信息,请参阅jersey文档)。创建一个类似的类: 然后,你的方法将如下所示