Как отправить файл через Soap в python? - PullRequest
1 голос
/ 06 июля 2011

Я хочу отправить zip-файл через SOAP (с клиента SOAP на сервер SOAP) в python.

После прочтения этого вопроса SO я решил использовать sudsкак мой клиент Python.Но, согласно this , пены не поддерживают отправку вложений.Дается метод, чтобы обойти проблему, но я не смог заставить его работать.Я озадачен тем, что я должен дать в качестве параметров.

Кто-нибудь знает, как отправить файл через Soap в python?

При необходимости я переключусь на другую клиентскую библиотеку SOAP.

Ответы [ 3 ]

6 голосов
/ 07 июля 2011

Загрузите прилагаемую оболочку, а затем, где вы обычно говорите что-то вроде ...

client.service.fooMethod(fooParam1,fooParam2,...)

... вместо этого ...

soap_attachments.with_soap_attachment(client.service.fooMethod,binaryParam,fooParam1,fooParam2,...)

Где binaryParam имеет тип, ожидаемый soap_attachements.py. Например, если вы хотите отправить изображение в формате png, я думаю (никогда не делал этого), вы бы сделали:

imageFile = open('imageFile.png','rb')
imageData = imageFile.read()
mimeType = 'image/png'
binaryParam = (imageData, uuid.uuid4(), mimeType)
3 голосов
/ 09 июля 2011

Вложения - лучший способ отправки двоичного файла через SOAP. Если вы не можете использовать любой другой метод, кроме только SOAP, просто закодируйте свои двоичные файлы с помощью Base64 и вставьте его в метод SOAP в качестве параметра. Это не чисто, но прекрасно работает с небольшими вложениями. Большие двоичные файлы? Используйте FTP, WebDAV и все другие встроенные способы отправки файлов между хостами.

1 голос
/ 09 июля 2011

Я внес следующие изменения в soap_attachments.py в разделе suds, чтобы мои собственные загрузки работали. Возможно, вам не понадобятся некоторые изменения, которые я внес в это, но, надеюсь, это по крайней мере даст вам старт.

--- /home/craig/Downloads/soap_attachments.py   2011-07-08 20:38:55.708038918 -0400
+++ soap_attachments.py 2011-06-21 10:29:50.090243052 -0400
@@ -1,4 +1,8 @@
+import uuid
+import re
 def with_soap_attachment(suds_method, attachment_data, *args, **kwargs):
+    HUD_ARM_SERVICE_URL = suds_method.client.wsdl.url
+    HUD_ARM_SERVICE_URL = HUD_ARM_SERVICE_URL.replace('wsdl','xsd')
     """ Add an attachment to a suds soap request.

     attachment_data is assumed to contain a list:
@@ -16,7 +20,9 @@
     soap_method = suds_method.method

     if len(attachment_data) == 3:
+        print "here"
         data, attachment_id, attachment_mimetype = attachment_data
+        attachment_id = uuid.uuid4()
     elif len(attachment_data) == 2:
         data, attachment_id = attachment_data
         attachment_mimetype = MIME_DEFAULT
@@ -55,7 +61,7 @@
     ])

     # Build the full request
-    request_text = '\n'.join([
+    request_text = '\r\n'.join([
       '',
       '--%s' % boundary_id,
       soap_headers,

Я тогда использую:

f = open(dir_path + infile,'rb')
data_file = f.read()
data_file_type = mimetypes.guess_type(infile)[0]
(filename,ext) = infile.split('.')
...

clientargs = [...]
identifier = with_soap_attachment(client.service.fooThing, [data_file, '1', data_file_type], credentials['foo'],credentials['bar'], morefoo)

Возможно, вам не нужны все эти изменения, но это то, что заставило меня двигаться.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...