2009-07-15 24 views
6

Môi trường:Làm thế nào để tạo arrayType cho WSDL bằng Python (sử dụng suds)?

  • Python v2.6.2
  • bọt v0.3.7

WSDL (server) Tôi làm việc với, có sơ đồ sau tiểu mục (Tôi cố gắng để viết nó sử dụng rõ ràng văn bản đơn giản) -


[sub-se ction # 1]

searchRequest: (searchRequest){ 
    userIdentification = (userIdentification){ 
     username = "" 
     password = "" 
     } 
    itineraryArr = (itineraryArray){ 
     _arrayType = "" 
     _offset = "" 
     _id = "" 
     _href = "" 
     _arrayType = "" 
     } 
    ... 
    ... 

[sub-section # 2]

itinerary: (itinerary){ 
    departurePoint = (locationPoint){ 
     locationId = None 
     radius = None 
     } 
    arrivalPoint = (locationPoint){ 
     locationId = None 
     radius = None 
     } 
    ... 
    ... 

Không có vấn đề với 'userIdentification' (mà là một " đơn giản "loại)

Nhưng, 'itineraryArr' là một mảng của 'hành trình', và tôi không biết cách sử dụng python để tạo mảng XML.

tôi đã cố gắng vài kết hợp, ví dụ

itinerary0 = self.client.factory.create('itinerary') 
itineraryArray = self.client.factory.create('itineraryArray') 
itineraryArray = [itinerary0] 
searchRequest.itineraryArr = itineraryArray 

Nhưng tất cả các thử nghiệm của tôi dẫn với lỗi cùng một máy chủ -

Server raised fault: 'Cannot use object of type itinerary as array' 
    (Fault){ 
     faultcode = "SOAP-ENV:Server" 
     faultstring = "Cannot use object of type itinerary as array" 
    } 

Trả lời

4

Tôi tin rằng những gì bạn đang tìm kiếm là:

itinerary0 = self.client.factory.create('itinerary') 
itineraryArray = self.client.factory.create('itineraryArray') 
print itineraryArray 
itineraryArray.itinerary.append(itinerary0) 

Chỉ cần tự mình làm điều này;) Điều gì đã giúp tôi tìm thấy nó đang được in trên bảng điều khiển. Mà có thể đã có thể đưa cho bạn như sau:

(itineraryArray){ 
    itinerary[] = <empty> 
} 

Chúc mừng, Jacques

2

Đối với loại cấu trúc tôi đặt một thuộc tính gọi là 'mục' trên đối tượng mảng và sau đó nối các thành viên danh sách với nó. Một cái gì đó như:

itineraryArray = self.client.factory.create('itineraryArray') 
itineraryArray.item = [itinerary0] 

Phân tích cú pháp và chuyển tiếp tốt, ngay cả đối với các cuộc gọi phức tạp với nhiều cấp độ.

6

Tôi đang ở trong cùng một trường hợp, với kiểu RPC/mã hóa WS và phương thức chứa một mảng xà phòng. một yêu cầu in (nơi request = client.factory.create('Request')) cho:

(Request){ 
    requestid = None 
    option = 
    (ArrayOfOption){ 
    _arrayType = "" 
    _offset = "" 
    _id = "" 
    _href = "" 
    _arrayType = "" 
    } 
} 

Các giải pháp được đưa ra bởi Jacques (1request.option.append (option1) 1) không hoạt động, vì nó kết thúc với một thông báo lỗi ArrayOfOption instance has no attribute append.

Các giải pháp được đưa ra bởi mcauth trông như thế này:

array = client.factory.create('ArrayOfOption') 
array.item = [option1, option2, option3, option4, option5, option6] 
request.option=array 

Nó hoạt động như vậy nên, là kết quả thông điệp SOAP cho thấy không có arrayType thuộc tính:

<option xsi:type="ns3:ArrayOfOption"> 

Giải pháp tốt nhất tôi thấy cũng là đơn giản nhất:

request.option = [option1, option2, option3, option4, option5, option6] 

Kết thúc bằng thông điệp SOAP tốt:

<option xsi:type="ns0:ArrayOfOption" ns3:arrayType="ns0:Option[6]"> 

như mong đợi bởi phía máy chủ WS.

Các vấn đề liên quan