首先,我会卷曲调用,这样服务器就知道什么期望添加-H "Content-Type: text/xml"
的头。如果您发布了服务器代码(不一定是所有内容,但至少发生了什么问题),这将会很有帮助。
要调试这个我会用
@app.before_request
def before_request():
if True:
print "HEADERS", request.headers
print "REQ_path", request.path
print "ARGS",request.args
print "DATA",request.data
print "FORM",request.form
这是一个有点粗糙,但有助于看看发生了什么事情在每个请求。在调试时根据需要使用if语句打开和关闭它。
在cURL调用中运行没有xml头的请求会将数据发送到request.form字典。添加XML头部定义会导致数据出现在request.data中。不知道你的服务器在哪里出现故障,上面应该至少给你提示如何继续。
编辑指以下评论:
我会用出色的xmltodict库。这种卷曲呼叫
import xmltodict
@app.before_request
def before_request():
print xmltodict.parse(request.data)['xml']['From']
:使用此测试
curl -X POST -d '<xml><From>Jack</From><Body>Hello, it worked!</Body></xml>' localhost:5000 -H "Content-Type: text/xml"
'杰克' 打印出来没有问题。
请注意,此调用已从您的问题中修改 - 添加了'xml'标记,因为XML需要根节点(出于某种原因,它被称为xml 树)。没有这个标签,你会从xmltodict(或你选择的其他解析器)中得到一个解析错误。
好了,所以当我添加的内容类型和before_request叫我回去: REQ_path /测试 ARGS ImmutableMultiDict([]) 数据杰克 FORM ImmutableMultiDict([]) 于是我想我的现在的问题是,我如何从Flask内部获得'name'(我已经尝试了request.data和request.DATA.name等),并且随后将如何通过XML中的ARGS(例如,如果我想要我的服务需要用户名和密码)Cheers @GC_Python –
JMzance
@JMzance,请参阅编辑原始答案。 –