Я пытаюсь понять, как передать многопараметрические аргументы в запрос клиента WSDL SUD.
Например:
from suds.client import Client
url = wsdl
suds_client = Client(url)
print(suds_client)
Создает методы API, которые выглядят следующим образом:
getStations (reportsDataSet [] arg0)
getLoadedDataSets ()
loadDataSet (reportsDataSet arg0)
getEstimate (эстимейт_просмотра arg0)
Я могу запускать запросы без требований к параметрам, например getLoadedDataSets (), и получать результаты, но я не совсем уверен, как обрабатывать методы, такие как loadDataSet () или getEstimate (), с учетом аргументов, которые я должен передавать.
Приведенный ниже код работает с использованием Python Requests / XML:
## since having some issues right now with zeep/getEstimate generating wrong results
##...attempting different method
url = wsdl
#headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.ext.tally.arbitron.com/">
<soapenv:Header/>
<soapenv:Body>
<ws:getEstimate>
<arg0>
<dayparts>
<endDayOfWeek>FRIDAY</endDayOfWeek>
<endQuarterHourOfDay>0615</endQuarterHourOfDay>
<startDayOfWeek>MONDAY</startDayOfWeek>
<startQuarterHourOfDay>0600</startQuarterHourOfDay>
</dayparts>
<estimateTypeCodes>aqh</estimateTypeCodes>
<reportingDataSetIds>PPM-FEB-2020-007</reportingDataSetIds>
<returnQuarterHoursInDaypart>True</returnQuarterHoursInDaypart>
<returnStationIdOnly>False</returnStationIdOnly>
<filterSet>
<joinType>AND</joinType>
<requestFilters>
<attribute>metro_segment_of_audience</attribute>
<operand>=</operand>
<value>true</value>
</requestFilters>
<requestFilters>
<attribute>start_age</attribute>
<operand>=</operand>
<value>25</value>
</requestFilters>
<requestFilters>
<attribute>end_age</attribute>
<operand>=</operand>
<value>54</value>
</requestFilters>
</filterSet>
<stations>
<stationId>15053</stationId>
</stations>
</arg0>
</ws:getEstimate>
</soapenv:Body>
</soapenv:Envelope>
"""
response = requests.post(url,data=body,headers=headers)
Но когда я пытаюсь преобразовать это в похожий объект словаря для SUD, я получаю сообщение об ошибке проблема в том, как обрабатывать параметры, которые требуются SUD + getEstimate (), и искать помощь с форматированием (поскольку я не могу понять это из gitHub SUD):
## the below is the BARE-MINIMUM parameters required to use this query
## we can alter as needed
kyw_suds_req = {
'dayparts': {
'endDayOfWeek':'FRIDAY', #variable
'endQuarterHourOfDay':'0615', #variable
'startDayOfWeek':'MONDAY', #variable
'startQuarterHourOfDay':'0600' #variable
}, #end dayparts
'estimateTypeCodes':'aqh', #variable
'reportingDataSetIds': 'PPM-FEB-2020-007', #variable
'returnQuarterHoursInDaypart': 'True',
'returnStationIdOnly': 'False',
'filterSet': {
'joinType':'AND', #ALL conditions in below requestFilters have to be met
'requestFilters': { #1 area filter
'attribute':'metro_segment_of_audience', #variable
'operand':'=', #variable
'value': 'True'
}, #end requestFilters1
'requestFilters': { #2 demo start_age filter
'attribute':'start_age', #variable
'operand':'=', #variable
'value':'25' #variable
}, #end requestFilters2
'requestFilters': { #3 demo end_age filter
'attribute':'end_age', #variable
'operand':'=', #variable
'value':'54' #variable
} #end requestFilters3
}, #end filterSet
'stations': {
'stationId':'15053'
} #end stations
}
kyw_sample = suds_client.service.getEstimate(kyw_suds_req)
генерирует thi Ошибка при отладке:
DEBUG:suds.client:sending to (http://localhost:8080/ArbitronTallyWebServices/tally)
message:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ws.ext.tally.arbitron.com/">
<SOAP-ENV:Header/>
<ns0:Body>
<getEstimate xmlns="http://ws.ext.tally.arbitron.com/">
<arg0>
<dayparts>
<endDayOfWeek>FRIDAY</endDayOfWeek>
<endQuarterHourOfDay>0615</endQuarterHourOfDay>
<startDayOfWeek>MONDAY</startDayOfWeek>
<startQuarterHourOfDay>0600</startQuarterHourOfDay>
</dayparts>
<estimateTypeCodes>aqh</estimateTypeCodes>
<filterSet>
<joinType>AND</joinType>
<requestFilters>
<attribute>end_age</attribute>
<operand>=</operand>
<value>54</value>
</requestFilters>
</filterSet>
<reportingDataSetIds>PPM-FEB-2020-007</reportingDataSetIds>
<returnQuarterHoursInDaypart>True</returnQuarterHoursInDaypart>
<returnStationIdOnly>False</returnStationIdOnly>
<stations>
<stationId>15053</stationId>
</stations>
</arg0>
</getEstimate>
</ns0:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:headers = {'Content-Type': 'text/xml; charset=utf-8', 'SOAPAction': b'""', 'content-type': 'text/xml'}
DEBUG:suds.client:Reply HTTP status - 500 - Internal Server Error
b'<?xml version="1.0" ?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://ws.ext.tally.arbitron.com/"><soapenv:Body><soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><faultcode>soapenv:Server</faultcode><faultstring>java.lang.NullPointerException</faultstring></soapenv:Fault></soapenv:Body></soapenv:Envelope>'
И ошибка WebFault: ошибка сервера: 'java .lang.NullPointerException'
Любая помощь в помощи с форматированием / ошибкой будет оценили.