Я пытаюсь использовать SOAP с C #. Magento 1.4.2.
http://localhost/api/v2_soap/?wsdl
Здесь я вижу catalogProductCreate
Поэтому я пытаюсь установить соединение с:
$proxy = new SoapClient('http://localhost/api/v2_soap/?wsdl'); $sessionId = $proxy->login('xxx', 'xxxxxx'); // user with full access $newProductData = new stdClass(); $newProductData->name = 'Product Name'; $newProductData->description = 'Description'; $newProductData->short_description = 'Short Description'; $newProductData->websites = array(138); $newProductData->categories = array(7,15); $newProductData->status = 1; $newProductData->price = 45; $newProductData->tax_class_id = 2; $newProductData->weight = 1; $result = $proxy->catalogProductCreate( $sessionId, // Soap Session 'simple', // Product Type 4, // Attribute Set Id (Default) 'product-sku', // Product Sku $newProductData // Product Data );
Но я получаю этот результат:
Неустранимая ошибка: исключить исключение SoapFault: [4] Путь к ресурсам не может быть вызван.
(подробности – Magento 1.6.x, но методы, если не детали, должны быть применимы к другим версиям)
Я полагаю, основываясь на вашем примере кода, что вы используете PHP-клиентский код для проверки существования метода, который затем можно применить к вызову из вашего приложения C #?
Предполагая, что это так, это означает, что вы знаете PHP, поэтому вы захотите отладить это на уровне PHP-сервера Magento. Единственный файл класса, который производит эту ошибку,
app/code/core/Mage/Api/Model/Server/Handler/Abstract.php
Либо добавьте следующий журнал для временного и непосредственного доступа к этому файлу, либо удалите копию файла класса в
app/code/local/Mage/Api/Model/Server/Handler/Abstract.php
для переопределения кодировки.
Просмотрите этот файл класса для следующего исключения
throw new Mage_Api_Exception('resource_path_not_callable')
Это то, что заставляет мыльный сервер Magento реагировать с этой ошибкой. В этом файле есть четыре места. Добавьте вызовы регистрации выше каждого из них.
Mage::Log(sprintf('Line %s in file %s',__LINE__, __FILE__)); throw new Mage_Api_Exception('resource_path_not_callable');
Это позволит вам узнать, какая ошибка вызывает вашу проблему, из которой вы можете отлаживать и регистрировать дальше. Это может произойти в двух местах (четыре файла в файле, один для обычного вызова, другой для многократного вызова).
В порядке появления, с возможными причинами в комментариях.
//here magento is attempting to instantiate the "API Model" that will perform //the work of your API call. Upon instantiation, it discovers that the model //doesn't inherit from Mage_Api_Model_Resource_Abstract, and bails. //This is rare for a non-custom API call, but might be caused by a class rewrite //gone amuck, or a very hacked system try { $model = Mage::getModel($modelName); if ($model instanceof Mage_Api_Model_Resource_Abstract) { $model->setResourceConfig($resources->$resourceName); } } catch (Exception $e) { Mage::Log(sprintf('Line %s in file %s',__LINE__, __FILE__)); throw new Mage_Api_Exception('resource_path_not_callable'); } //Here Magento's been able to instantiate the $model, and is checking if the method is //callable. If not, it bails. Again, for a standard, stock API call this shouldn't //be happening, but could be the result of a rewrite gone wrong, or someone hacking an //api class to make the method non accesible, or someone hacking the method mapping in api.xml if (is_callable(array(&$model, $method))) { if (isset($methodInfo->arguments) && ((string)$methodInfo->arguments) == 'array') { return $model->$method((is_array($args) ? $args : array($args))); } elseif (!is_array($args)) { return $model->$method($args); } else { return call_user_func_array(array(&$model, $method), $args); } } else { Mage::Log(sprintf('Line %s in file %s',__LINE__, __FILE__)); throw new Mage_Api_Exception('resource_path_not_callable'); }
Выясните, почему Magento бросает ошибку API. Он будет часто указывать на тип вашего вызова на мыло, или указывать на то, что было взломано в вашей системе PHP
Убедившись, что вы можете использовать ресурс wsdl правильно, но я также столкнулся с этой проблемой, когда у меня не было пользователя, настроенного на правильные разрешения в роли.
Попробуйте создать пользователя webservice с ролью и назначьте их роли, имеющей доступ к «ALL». параметр в меню ресурсов роли в информации о роли.
Поместите этот файл в корневую папку magento / project, чтобы вы могли получить доступ ко всему методу magento.
Наслаждайтесь идеей …