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 и SOAP v1 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">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'}}]}

в python.

И те все още връщат всички поръчки (евентуално...). Така че, както споменах, ако някой наистина може да ми даде някакъв 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
актуализирах въпроса си, за да отрази този отговор. освен това, това не е ли V2 API? - person Eli Albert; 11.09.2012
comment
@EliAlbert Вашият е SOAP API V2, но параметърът ще бъде същият, защото V2 разширява V1 API класове (на 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