Фильтры Magento SOAP v1 не фильтруют (Python Suds)

обновлено ниже

Есть ли у кого-нибудь пример правильного XML для Magento SOAP v1 API, чтобы сделать что-то вроде следующего?

client.call(session_token,'sales_order.list', {'filters':{'order_id':{'eq':12}}})

Это пример вызова python suds, который у меня не работает. На самом деле подойдет любой пример XML, который фильтрует sales_order.list, catalog_product.list или customer.list. У меня это уже работает для версии XMLRPC, но с SUDS Python и API SOAP v1, независимо от того, какой фильтр, я получаю весь список без фильтрации в качестве ответа. Вот как сейчас выглядит XML:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns4="urn:Magento" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns4:call>
<sessionId xsi:type="ns2:string">6634e1bd1004557677222fd81e809884</sessionId>
<resourcePath xsi:type="ns2:string">sales_order.list</resourcePath>
<args xsi:type="ns0:args">
<filters xsi:type="ns2:filters">
<order_id xsi:type="ns2:order_id">
<eq xsi:type="ns2:string">7</eq>
</order_id>
</filters>
</args>
</ns4:call>
</ns1:Body>

Конечно, я уже испробовал миллион других вариаций вышеперечисленного. Мне просто интересно, верны ли мои вызовы, и у меня плохая схема, или сервер мыла шаткий, или что-то в этом роде. Таким образом, если у кого-то есть проверенный правильный XML, который можно попытаться эмулировать, это очень поможет.

Спасибо!

обновление:

согласно первому ответу, который я получил до сих пор, я уже пробовал этот формат для фильтров. Документация для Magento API, как мы знаем, разнообразна, противоречива и неполна. вот XML:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns4="urn:Magento" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns4:call>
<sessionId xsi:type="ns2:string">93c7aaab38adaab5db732b211e5b</sessionId>
<resourcePath xsi:type="ns2:string">sales_order.list</resourcePath>
<args xsi:type="ns0:args">
<filter xsi:type="ns2:filter">
<value xsi:type="ns2:string">123</value>
<key xsi:type="ns2:string">order_id</key>
</filter>
</args>
</ns4:call>
</ns1:Body>
</SOAP-ENV:Envelope>

или возможно:

<ns1:Body>
<ns4:call>
<sessionId xsi:type="ns2:string">93c74cb7ef0baaaaab5db732b211e5b</sessionId>
<resourcePath xsi:type="ns2:string">sales_order.list</resourcePath>
<args xsi:type="ns0:args">
<filter xsi:type="ns2:filter">
<value xsi:type="ns2:value">
<value xsi:type="ns2:string">123</value>
<key xsi:type="ns2:string">eq</key>
</value>
<key xsi:type="ns2:string">order_id</key>
</filter>
</args>
</ns4:call>
</ns1:Body>
</SOAP-ENV:Envelope>

который выглядит так:

{'filter':[{'key':'order_id','value':{'key':'eq','value':'123'}}]}

в питоне.

И те по-прежнему возвращают все заказы (в конце концов...). Так что, как я уже упоминал, если кто-нибудь действительно может дать мне некоторый XML для эмуляции, это может быть более полезным. Я, вероятно, собираюсь завтра получить доступ к исходному коду Magento и решить свою проблему.


person Eli Albert    schedule 05.09.2012    source источник
comment
Вы когда-нибудь получали XML? Я работаю против той же проблемы. И куча примеров PHP, которые как бы побеждают смысл API, а :)   -  person baash05    schedule 27.08.2013


Ответы (4)


Что ж, мне пришлось отмахнуться (и выучить) свой PHP, но у меня есть ответ здесь, если появятся какие-то другие бедолаги и захотят использовать SUDS (или python в целом) с Magento.

этот xml:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body><ns1:call><sessionId xsi:type="xsd:string">bc11488aaae84c841ac237ea7f24ef</sessionId>
<resourcePath xsi:type="xsd:string">sales_order.list</resourcePath>
<args SOAP-ENC:arrayType="ns2:Map[1]" xsi:type="SOAP-ENC:Array">
<item xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">order_id</key>
<value xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">from</key>
<value xsi:type="xsd:string">11</value>
</item>
<item>
<key xsi:type="xsd:string">to</key>
<value xsi:type="xsd:string">12</value>
</item>
</value>
</item>
</item>
</args>
</ns1:call>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

создается этим php:

#! /usr/bin/php5
<?php
$client = new SoapClient('http://ip.ip.ip.ip/magento/index.php/api/?wsdl', array('trace'=>TRUE));
$session = $client->login('username', 'password');
$params = array(array(
        'order_id' =>
          array(
            'from' => '10',
            'to' => '12')));



$result = $client->call($session, 'sales_order.list', $params);
$resultXML = $client->__getLastRequest();
print($resultXML);
?>

Конечно, оказывается, что есть также проблемы с кодированием, связанные с SOAP, связанные с конкретной реализацией протокола Magento - кажется, что он предназначен для работы с клиентом PHP Soap, но не с чем-либо еще. Но этот дамп XML позволил мне взломать и установить соединение SUDS с земли — пришлите мне сообщение, если вам интересно. О, и совет @alanstorm.

person Eli Albert    schedule 12.09.2012
comment
Да, сериализация Hash и Array использует ns2:Map и SOAP-ENC:Array соответственно, которые вызваны PHP SoapServer. Использование традиционных элементов XML даст вам stdObject из PHP SoapServer в Magento вместо ассоциативного массива. - person Carson Reinke; 09.07.2014
comment
+1 Омг.. это круто. Я применял фильтр к customer.list. И представленное здесь решение сработало для меня для API v1. Я только что изменил имя поля. Спасибо :) - person Ravi Dhoriya ツ; 23.08.2014
comment
отправка сообщения не является вещью в stackoverflow :) Не могли бы вы обновить свой ответ, чтобы поделиться эквивалентом Python, если это возможно? Я тут с ума схожу :/ - person pypat; 25.04.2016

Вы вводите неверный формат массива входных данных для фильтра.

Я думаю, если это решение для php.

$params = array(array(
            'filter' => array(
                array(
                    'key' => 'status',
                    'value' => 'pending'
                ),
                array(
                    'key' => 'created_at',
                    'value' => '2001-11-25 12:12:07',
                )
            ),
            'complex_filter' => array(
                array(
                    'key' => 'order_id',
                    'value' => array(
                        'key' => 'in',
                        'value' => '12,23'
                    ),
                ),
                array(
                    'key' => 'protect_code',
                    'value' => array(
                        'key' => 'eq',
                        'value' => 'ebb2a0'
                    ),
                ),
            )
        ));

$result = $client->__call('salesOrderList', $params);

Вы можете просто уравнять его с python.

person Josua Marcel C    schedule 10.09.2012
comment
обновил мой вопрос, чтобы отразить этот ответ. Кроме того, это не API V2? - person Eli Albert; 11.09.2012
comment
@EliAlbert У вас SOAP API V2, но параметр будет таким же, потому что V2 расширяет классы API V1 (на php). - person Josua Marcel C; 12.09.2012
comment
Вы хотели сказать, что у вас SOAP API V1? На самом деле я обнаружил, что многие параметры фильтра для V2 не применимы к V1 — например, оператор in не работал в моих тестах. - person Eli Albert; 12.09.2012
comment
Да, ты прав!! извините за опечатку. хороший ответ @EliAlbert - person Josua Marcel C; 12.09.2012
comment
вопрос в python и XML. Ответ на другом языке. Удобно это. - person baash05; 27.08.2013

Я знаю, что этот вопрос касается v1 API, но если вы используете v2, вы можете сделать это:

PHP:

$complexFilter = array(
    'complex_filter' => array(
        array(
            'key' => 'type',
            'value' => array('key' => 'in', 'value' => 'simple,configurable')
        )
    )
);
$result = $client->catalogProductList($session, $complexFilter);

Эквивалент Python:

complex_filter = [{'complex_filter': [{
    'key': 'type',
    'value': [{
        'key': 'in',
        'value': 'simple,configurable'}]
    }]
}]
client.service.catalogProductList(session, complex_filter)
person Luqmaan    schedule 15.08.2013

Я пробую эквивалент Python и продолжаю получать

ValidationError: Missing element for Any 

Однако я передаю фильтр методу client.service

person user1368677    schedule 13.08.2020