从python使用XML的POST烧瓶服务器

JMz*_*nce 5 python xml curl web-services flask

我有一个烧瓶服务器并在pythonanywhere上运行,我正在尝试编写一个python脚本,我可以在本地运行,这将触发一个特定的响应 - 让我们说服务器时间,为了讨论的缘故.有关如何编写此过程的Flask服务器端的文档和吨文档,但非如此/很少有关于如何编写可触发Flask应用程序运行的内容的文档.我试过以简单的curl命令的形式发送XML,例如

curl -X POST -d '<From>Jack</From><Body>Hello, it worked!</Body>' URL
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用(有关推荐标题的错误).

有人能告诉我构建一些可以发送到监听烧瓶服务器的XML的正确方法.

谢谢,

插口

GG_*_*hon 8

首先,我将添加-H "Content-Type: text/xml"到cURL调用中的标头,以便服务器知道会发生什么.如果您发布服务器代码(不一定是所有内容,但至少是失败的内容)会很有帮助.

要调试这个我会用

@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
Run Code Online (Sandbox Code Playgroud)

这有点粗糙,但有助于了解每个请求发生了什么.在调试时根据需要使用if语句打开和关闭它.

在cURL调用中运行没有xml标头的请求会将数据发送到request.form字典.添加xml标头定义会导致request.data中出现数据.如果不知道服务器在哪里出现故障,上面的内容应该至少给出一个如何继续的提示.

编辑参考下面的评论:

我会使用优秀的xmltodict库.用它来测试:

import xmltodict
@app.before_request
def before_request():
    print xmltodict.parse(request.data)['xml']['From']
Run Code Online (Sandbox Code Playgroud)

有了这个cURL电话:

curl -X POST -d '<xml><From>Jack</From><Body>Hello, it worked!</Body></xml>' localhost:5000 -H "Content-Type: text/xml"
Run Code Online (Sandbox Code Playgroud)

'杰克'打印出来没有问题.

请注意,此调用已从您的问题中进行了修改 - 添加了"xml"标记,因为XML需要根节点(出于某种原因,它被称为xml ).如果没有此标记,您将从xmltodict(或您选择的任何其他解析器)获得解析错误.