Python - ValueError: элемент № 0 последовательности обновления словаря имеет длину 15; 2 требуется

Я использую Zeep, чтобы попытаться взаимодействовать с клиентом SOAP в SellerCloud. Когда я передаю свой аргумент для одной из операций API, я получаю ValueError -

ValueError: dictionary update sequence element #0 has length 15; 2 is required

Вот соответствующий код:

from zeep import Client
import datetime

wsdl_url = "http://tt.ws.sellercloud.com/scservice.asmx?WSDL"
client = Client(wsdl_url)
auth_type = client.get_type("ns0:AuthHeader")
sc_auth = auth_type(UserName=<username>, Password=<password>)

from_date = datetime.date(2018, 7, 3).strftime("%Y-%m-%d %H:%M:%S")
to_date = datetime.date(2018, 7, 11).strftime("%Y-%m-%d %H:%M:%S")

sc_keys = ["DateFrom", "DateTo", "UseSP", "ShippingStatusKind", "IncludeDS"]
sc_values = [from_date, to_date, "GET", "1", "TRUE"]

filters_type = client.get_type("ns0:SerializableDictionaryOfStringString")
filters = filters_type(sc_keys, sc_values)

print filters
print 'length of filters - ', len(filters)

with client.settings(extra_http_headers=sc_auth, force_https=False):
  order_ids = client.service.Orders_Get(filters)

И ошибка трассировки стека -

Traceback (most recent call last):
  File "seller-cloud.py", line 24, in <module>
    order_ids = client.service.Orders_Get(filters)
  File "/home/user/Envs/seller-cloud/local/lib/python2.7/site-packages/zeep/proxy.py", line 42, in __call__
    self._op_name, args, kwargs)
  File "/home/user/Envs/seller-cloud/local/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 121, in send
    options=options)
  File "/home/user/Envs/seller-cloud/local/lib/python2.7/site-packages/zeep/wsdl/bindings/soap.py", line 99, in _create
    http_headers.update(client.settings.extra_http_headers)
ValueError: dictionary update sequence element #0 has length 15; 2 is required

И вывод моих операторов печати до того, где произошла ошибка -

{
    'Keys': [
        'DateFrom',
        'DateTo',
        'UseSP',
        'ShippingStatusKind',
        'IncludeDS'
    ],
    'Values': [
        '2018-07-03 00:00:00',
        '2018-07-11 00:00:00',
        'GET',
        '1',
        'TRUE'
    ]
}
length of filters -  2

Некоторое время я бился об этом, но, похоже, не могу найти, где происходит вся эта сделка из 15. Даже если я передам пустой массив, например: filters = filters_type([]), я все равно получу ошибку длины 15.


person demluckycharms    schedule 16.10.2018    source источник
comment
Мое предположение, и это трудно сказать из этого примера, но я думаю, что фильтры нужно передавать как словарь пар ключ-значение. т.е. {'DateFrom': '2018...'}   -  person pypypy    schedule 17.10.2018
comment
Да, я тоже пробовал. Передача словаря непосредственно в client.service.Orders_Get(filters) и обход шага filters_type дает ту же ошибку.   -  person demluckycharms    schedule 17.10.2018


Ответы (1)


Основываясь на трассировке, при обновлении заголовков HTTP здесь происходит сбой:

http_headers.update(client.settings.extra_http_headers)

Я хотел бы выяснить, правильно ли extra_http_headers=sc_auth устанавливает заголовки. Похоже, вам нужно передать туда простые HTTP-заголовки (dict), и вы даете ему некоторую структуру SOAP.

person Santiago Bruno    schedule 16.10.2018
comment
Похоже, что это могло быть так. Но теперь я столкнулся с новой проблемой. client.service.Orders_Get(), очевидно, нуждается в определенной структуре SOAP для правильной аутентификации, которая из документации API выглядит как Orders_Get(SCAuth, SCSettings, filters). К сожалению, передача здесь более одного аргумента вызывает ошибку, говорящую, что разрешен только один аргумент. - person demluckycharms; 17.10.2018
comment
Сообщение об ошибке с указанием необходимости аутентификации в вызове метода - zeep.exceptions.Fault: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Exception: Please provide authentication information in AuthHeaderValue property of service object. - person demluckycharms; 17.10.2018
comment
Точно сказать не могу. Взгляните на эту документацию: python-zeep.readthedocs.io/en/master /headers.html Вероятно, вам нужно вызвать Orders_Get с _soapheaders именованным параметром и имеющейся у вас информацией об авторизации. - person Santiago Bruno; 17.10.2018
comment
Использование _soapheaders определенно помогает. Похоже, процесс аутентификации теперь запускается правильно. Конечно, теперь мне говорят, что мое имя пользователя недействительно, несмотря на то, что оно было скопировано / вставлено. Это проблема, которую на самом деле нельзя исправить, поэтому я отмечу ваше решение как правильное! Спасибо! - person demluckycharms; 17.10.2018