Проблема с форматом сообщений XML-RPC - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть WS (ZOPE / PLONE), который принимает некоторые вызовы XMLRPC.

Итак, я пишу фрагмент кода Python для вызова WS и выполнения чего-либо.

Iследуйте формату сообщения, который я нашел здесь , и это мой фрагмент кода:

import httplib

def queryInventory():
    try:
        xmlrpc_envelope = '<?xml version="1.0"?>'\
                        '<methodCall>'\
                        '<methodName>easyram</methodName>'\
                          '<params>'\
                            '<param>'\
                              '<value>%s</value>'\
                            '</param>'\
                          '</params>'\
                        '</methodCall>'        

        params = '<EasyRAM>'\
             '<authentication><user>EasyRAM</user><pwd>EasyRAM</pwd><hotel>52</hotel></authentication>'\
             '<operation type="QueryInventory" rate="master"><date from="2012-03-10" to="2012-03-10" /><date from="2012-03-22" to="2012-03-22" /></operation>'\
             '</EasyRAM>'

        data = xmlrpc_envelope % params
        print data
        headers = {"Content-type": "text/xml"}
        conn = httplib.HTTPSConnection('myHost')
        aa = '/ws/xmlrpc/public/EasyRAM'
        conn.request("POST", aa, data, headers)
        response = conn.getresponse()
        print "EasyRAM.queryInventory() response: status=%s, reason=%s" % (response.status, response.reason)
        print "EasyRAM.queryInventory() response=%s" % response.read()
        conn.close()
    except Exception, ss:
        print "EasyRAM.queryInventory() -> Error=%s" % ss
        raise

    return ''

queryInventory()

Проблема в том, что я получаю следующее сообщение об ошибке:

Неверный запрос Параметр params был опущен в запросе.Обязательно укажите все обязательные параметры и повторите запрос.

Подобно тому, как параметр не передан.

Если я изменю свой фрагмент, обернув свой параметр (называемый params) в <string></string> таким образом:

 xmlrpc_envelope = '<?xml version="1.0"?>'\
                        '<methodCall>'\
                        '<methodName>easyram</methodName>'\
                          '<params>'\
                            '<param>'\
                              '<value><string>%s</string></value>'\
                            '</param>'\
                          '</params>'\
                        '</methodCall>'     

что-то происходит, но это не то, что я хочу;Фактически, мой параметр должен быть пустым (или, если хотите, пустым).

Любые идеи или предложения?

PS. Я знаю, что существует библиотека xml-rpc дляPython называется xmlrpclib, но я должен развиваться таким образом, потому что это пример для клиента, который не может напрямую использовать такую ​​библиотеку

1 Ответ

0 голосов
/ 08 февраля 2012

Я только что решил.

Если я добавлю функцию, подобную этой:

def escape(s, replace=string.replace):
s = replace(s, "&", "&amp;")
s = replace(s, "<", "&lt;")
return replace(s, ">", "&gt;",)

, и перед вызовом метода connection я сделаю что-то вроде:

params = escape(params)

Тогда все идет хорошо.

Надеюсь, что это может пригодиться для будущих целей

...