2015-04-14 3 views
4

У меня есть сервер флагов, запущенный и работающий на pythonanywhere, и я пытаюсь написать скрипт python, который я могу запустить локально, что вызовет конкретный ответ - скажем, время сервера, ради этой дискуссии. Существует тонна и тонна документации о том, как писать серверную часть фляжки этого процесса, но не очень мало о том, как писать что-то, что может запускать приложение Flask. Я попытался отправить XML в виде простой команды curl, например.Почтовый сервер флагов с XML из python

curl -X POST -d '<From>Jack</From><Body>Hello, it worked!</Body>' URL 

Но это, похоже, не работает (ошибки в заголовках рефералов).

Может ли кто-нибудь сообщить мне правильный способ составления XML-кода, который может быть отправлен на сервер флеш-памяти.

Спасибо,

Джек

ответ

5

Во-первых, я хотел бы добавить -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, если необходимо, при отладке.

Выполнение запроса без заголовка xml в вызове cURL отправляет данные в словарь request.form. Добавление определения заголовка xml приводит к появлению данных в файле request.data. Не зная, где ваш сервер терпит неудачу, приведенное выше должно дать вам хотя бы намек на то, как действовать.

EDIT со ссылкой на комментарий ниже:

Я хотел бы использовать отличную xmltodict библиотеку. Используйте для теста:

import xmltodict 
@app.before_request 
def before_request(): 
    print xmltodict.parse(request.data)['xml']['From'] 

с этим Curl вызова:

curl -X POST -d '<xml><From>Jack</From><Body>Hello, it worked!</Body></xml>' localhost:5000 -H "Content-Type: text/xml" 

печатает 'Джек' без проблем.

Обратите внимание, что этот вызов был изменен из вашего вопроса - добавлен тег «xml», поскольку для XML требуется корневой узел (он называется xml tree по какой-либо причине ..). Без этого тега вы получите ошибку синтаксического анализа из xmltodict (или любого другого парсера, который вы выберете).

+0

ИТАК, когда я добавить тип содержимого и before_request позвонить я вернусь: REQ_path/Тестирование ARGS ImmutableMultiDict ([]) DATA Jack ФОРМА ImmutableMultiDict ([]) Итак, я полагаю, мой вопрос в том, как мне получить «имя» изнутри Flask (я пробовал request.data и request.DATA.name и т. д.) и в качестве продолжения, как бы передать ARGS в XML (например, если бы я хотел моя служба требует имя пользователя и пароль) Cheers @GC_Python – JMzance

+1

@JMzance, см. редактирование оригинального ответа. –

Смежные вопросы