Python SUD и вызовы API с несколькими аргументами - Nielsen - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь понять, как передать многопараметрические аргументы в запрос клиента 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'

Любая помощь в помощи с форматированием / ошибкой будет оценили.

...