Возникли проблемы с Python SOAP с использованием Suds - PullRequest
0 голосов
/ 28 февраля 2011

У меня проблемы с Suds, и я не могу понять, что заставляет его вести себя так. Я пытаюсь вызвать веб-сервис, и этот сервис принимает один сложный тип как аргумент (ShippingGuideRequestType). Я выложу свой сеанс pdb и попытаюсь объяснить, что это происходит. Переменная 'request', которую вы видите, имеет тип ShippingGuideRequestType и он создается с помощью client.factory.create ("ShippingGuideRequestType").

(Pdb) request
(ShippingGuideRequestType){
   UserInformation = 
      (UserInformationType){
         Usercode = None
      }
   RequestProperties = 
      (RequestPropertiesType){
         SchemaVersion = None
         Language = None
         WithPrice = None
         WithExpectedDelivery = None
         WithGuiInformation = None
         NumberOfAlternativeDeliveryDates = None
         EDI = None
         PostingAtPostoffice = None
         Trace = None
      }
   ProductIds = 
      (ProductIdsType){
         ProductId[] = <empty>
      }
   Consignment = 
      (ConsignmentInputType){
         FromCountryCode = None
         FromPostalCode = None
         ToCountryCode = None
         ToPostalCode = None
         ShippingDate = 
            (DateAndTimeType){
               Year = None
               Month = None
               Day = None
               Hour = None
               Minute = None
            }
         EarlyCollectionAtTerminal = None
         AdditionalServices = 
            (AdditionalServicesInputType){
               AdditionalService[] = <empty>
            }
      }
   Packages = 
      (PackagesInputType){
         Package[] = <empty>
      }
 }

ShippingGuideRequestType выглядит хорошо, теперь давайте попробуем заполнить требуемый поля с данными. Давайте сначала разберемся со свойством UserInformation. Это создан с помощью client.factory.create ("UserInformationType"):

(Pdb) userInformation
(UserInformationType){
   Usercode = "-CENCORED-"
 }

Теперь давайте обработаем ProductIds, который создан с помощью client.factory.create ( "ProductIdsType"):

(Pdb) productsInput
(ProductIdsType){
   ProductId[] = 
      "SERVICEPAKKE",
 }

Последнее обязательное свойство - PackagesInputType, оно создается в несколько раз более сложным образом. Сначала я создаю PackagesInputType, затем я создаю массив PackageInputType (с помощью client.factory.create ("PackageInputType")).

(Pdb) packagesInput
(PackagesInputType){
   Package[] = 
      (PackageInputType){
         Height = 
            (UnitCodeLengthType){
               value = 10
               _unitCode = "CMT"
            }
         Width = 
            (UnitCodeLengthType){
               value = 10
               _unitCode = "CMT"
            }
         Length = 
            (UnitCodeLengthType){
               value = 10
               _unitCode = "CMT"
            }
         GrossWeight = 
            (UnitCodeWeightType){
               value = 1000
               _unitCode = "GRM"
            }
         Volume = 
            (UnitCodeCubicType){
               value = None
               _unitCode = "DMQ"
            }
         VolumeSpecial = None
         FromCountryCode = None
         FromPostalCode = "7800"
         ToCountryCode = None
         ToPostalCode = "7041"
         ShippingDate = 
            (DateAndTimeType){
               Year = None
               Month = None
               Day = None
               Hour = None
               Minute = None
            }
         AdditionalServices = 
            (AdditionalServicesInputType){
               AdditionalService[] = <empty>
            }
         EarlyCollectionAtTerminal = None
         _packageId = "myRef"
      },
 }
(Pdb) request.UserInformation = userInformation
(Pdb) request.ProductIds = productsInput
(Pdb) request.Packages = packagesInput
(Pdb) request
(ShippingGuideRequestType){
   UserInformation = 
      (UserInformationType){
         Usercode = "-CENCORED"
      }
   RequestProperties = 
      (RequestPropertiesType){
         SchemaVersion = None
         Language = None
         WithPrice = None
         WithExpectedDelivery = None
         WithGuiInformation = None
         NumberOfAlternativeDeliveryDates = None
         EDI = None
         PostingAtPostoffice = None
         Trace = None
      }
   ProductIds = 
      (ProductIdsType){
         ProductId[] = 
            "SERVICEPAKKE",
      }
   Consignment = 
      (ConsignmentInputType){
         FromCountryCode = None
         FromPostalCode = None
         ToCountryCode = None
         ToPostalCode = None
         ShippingDate = 
            (DateAndTimeType){
               Year = None
               Month = None
               Day = None
               Hour = None
               Minute = None
            }
         EarlyCollectionAtTerminal = None
         AdditionalServices = 
            (AdditionalServicesInputType){
               AdditionalService[] = <empty>
            }
      }
   Packages = 
      (PackagesInputType){
         Package[] = 
            (PackageInputType){
               Height = 
                  (UnitCodeLengthType){
                     value = 10
                     _unitCode = "CMT"
                  }
               Width = 
                  (UnitCodeLengthType){
                     value = 10
                     _unitCode = "CMT"
                  }
               Length = 
                  (UnitCodeLengthType){
                     value = 10
                     _unitCode = "CMT"
                  }
               GrossWeight = 
                  (UnitCodeWeightType){
                     value = 1000
                     _unitCode = "GRM"
                  }
               Volume = 
                  (UnitCodeCubicType){
                     value = None
                     _unitCode = "DMQ"
                  }
               VolumeSpecial = None
               FromCountryCode = None
               FromPostalCode = "7800"
               ToCountryCode = None
               ToPostalCode = "7041"
               ShippingDate = 
                  (DateAndTimeType){
                     Year = None
                     Month = None
                     Day = None
                     Hour = None
                     Minute = None
                  }
               AdditionalServices = 
                  (AdditionalServicesInputType){
                     AdditionalService[] = <empty>
                  }
               EarlyCollectionAtTerminal = None
               _packageId = "myRef"
            },
      }
 }

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

(Pdb) self.client.service.ShippingGuide(request) 
2011-02-28 14:32:37 ERROR suds.client <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://www.bring.no/logistics/shippingguide/1.0" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <ns1:Body>
      <ns0:ShippingGuideRequest>
         <ns0:UserInformation>
            <ns0:UserInformation>
               <ns0:Usercode>-CENCORED-</ns0:Usercode>
            </ns0:UserInformation>
            <ns0:RequestProperties>
               <ns0:SchemaVersion/>
            </ns0:RequestProperties>
            <ns0:ProductIds>
               <ns0:ProductId>SERVICEPAKKE</ns0:ProductId>
            </ns0:ProductIds>
            <ns0:Packages>
               <ns0:Package packageId="myRef">
                  <ns0:Height unitCode="CMT">10</ns0:Height>
                  <ns0:Width unitCode="CMT">10</ns0:Width>
                  <ns0:Length unitCode="CMT">10</ns0:Length>
                  <ns0:GrossWeight unitCode="GRM">1000</ns0:GrossWeight>
                  <ns0:Volume unitCode="DMQ"/>
                  <ns0:FromCountryCode/>
                  <ns0:FromPostalCode>7800</ns0:FromPostalCode>
                  <ns0:ToCountryCode/>
                  <ns0:ToPostalCode>7041</ns0:ToPostalCode>
               </ns0:Package>
            </ns0:Packages>
         </ns0:UserInformation>
         <ns0:RequestProperties/>
         <ns0:ProductIds/>
         <ns0:Packages/>
      </ns0:ShippingGuideRequest>
   </ns1:Body>
</SOAP-ENV:Envelope>
*** WebFault: Server raised fault: 'FG_INPUT_003 User information missing from request. [errorId cf19f72b-0795-4f58-8a70-a8c1846ba186]'

Что здесь произошло? Почему все закодировано в элементе UserInformation?

1 Ответ

0 голосов
/ 30 марта 2011

Вы дали этому попробовать:

shipping = client.factory.create("ShippingGuideRequestType")

shipping.UserInformation.UserCode = val1

shipping.RequestProperties.SchemaVersion = val2
shipping.RequestProperties.Language = val3

//Add the rest of the values.

client.service.shippingFunction(shipping)
...