2012-02-08 2 views
0

У меня есть WS (ZOPE/PLONE), которые принимают некоторые вызовы XMLRPC.Ошибка формата сообщения XML-RPC

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

Я следую messagge формат, который я нашел here, и это мой фрагмент кода:

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 для питона называется XMLRPCLIB, но я должен развиваться таким образом, потому что это пример для клиента, который не может непосредственно использовать библиотеку как тот

ответ

0

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

Если добавить такую ​​функцию:

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

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

params = escape(params) 

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

Надежность, которая может быть полезна для будущих целей