Весь сир-бор через те, що можливості REST в Magento просто жалюгідні.
На сьогодні Magento підтримує всі найбільш поширені способи доступу до API сайтів: REST, XML-RPC, SOAP.
Magento SOAP/XML-RPC API дає вам можливість керувати своїми магазинами електронної комерції, забезпечуючи методи для роботи з ресурсами, такими як клієнти, категорій, продукти і замовлення.
Про SOAP можна говорити багато і довго.
Для мене основними мінусами стали складність протоколу і відсутність вбудованої підтримки в Ruby.
Натомість стандарт XML-RPC зачарував мене своєю надзвичайною простотою.
В базову поставку Ruby вже входить бібліотека для роботи з XML-RPC, відповідно вам не доведеться замислюватися про структуру запитів і обробку відповідей в XML.
Тому саме XML-RPC в основному і буде присвячена ця стаття.
Не буду зупинятися на питанні, що таке XML-RPC і навіщо він потрібен. У мережі багато статей на цю тему.
Просто постараюся коротко показати, яким простим способом можливе створення клієнта до XML-RPC веб-сервісу на Ruby.
require 'xmlrpc/client' config = { api_user: 'user', api_key: 'secret', host: 'example.com', path: '/api/xmlrpc', port: 80, } client = XMLRPC::Client.new(config[:host], config[:path], config[:port]) # If somestuff requires api authentification, # we should get session token session = client.call('login', config[:api_user], config[:api_key]) parent_id = 1 store_view = 1 client.call('call', session, 'catalog_category.tree', [parent_id , store_view]) # If you don't need the session anymore client.call('endSession', session)
Все просто: ми підключаємося до сервера, отримуємо ключ сесії і виконуємо запити.
Документацію по всіх запитах Magento API можна знайти на офіційному сайті.
XML-RPC підтримується тільки першою версією Magento API.
А тепер найцікавіше! Цей код не працюватиме або працюватиме з перемінних успіхом по різному в усіх трьох основних реалізація мови: MRI Ruby, Rubinius і JRuby
MRI Ruby і Rubinius викликають наступну помилку:
Wrong size. Was 0, should be 147 (RuntimeError)
Недовге гуглення приводить до баги.
Додамо наступний рядок після ініціалізації клієнта:
client.http_header_extra = {"accept-encoding" => "identity"}
Але і це ще не все. Для деяких запитів XML-RPC в усіх трьох реалізаціях інколи з'являється помилка:
wrong/unknown XML-RPC type 'nil' (RuntimeError)
Рішення проблеми було знайдене тут.
XMLRPC::Config.module_eval { remove_const(:ENABLE_NIL_PARSER) # so that we're not warned about reassigning to a constant const_set(:ENABLE_NIL_PARSER, true) # so that we don't get "RuntimeError: wrong/unknown XML-RPC type 'nil'" }
На цьому все.
2 коментарі:
Давно вже не було постів. Вже покинули Ruby?
Ruby не покинув. Але блог це вже давно не веду.
Дописати коментар