Magento Web Service "product.info" ошибка: продукт не существует - PullRequest
0 голосов
/ 26 марта 2012

У меня проблема с веб-сервисом Magento (версия 1.6.0.0 Magento) в приложении для iPhone. На самом деле я могу войти и получить список продуктов с этим кодом (код списка продуктов): -

NSMutableString *parameters = [NSMutableString stringWithFormat:@"<sessionId>%@</sessionId><resourcePath>%@</resourcePath>", session, @"product.list"];    


NSString *operation=[NSString stringWithString:@"call"];
NSString *xmlNamespace=[NSString stringWithString:storeWsdlLink];
NSString *adress=[NSString stringWithString:storeURL];


NSString *operatorTag = [NSString stringWithFormat:@"<%@ xmlns=\"%@\">%@</%@>\n", operation, xmlNamespace, parameters, operation];

NSString *soapMessage = [NSString stringWithFormat:
                         @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                         "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/adressing\" xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\n"
                         "  <s:Header>\n"
                         "    <To xmlns=\"http://www.w3.org/2005/08/adressing\">%@</To>\n"
                         "    <a:Action>http://tempuri.org/IService1/%@</a:Action>\n"
                         "  </s:Header>\n"
                         "  <s:Body>\n"
                         "    %@"
                         "  </s:Body>\n"
                         "</s:Envelope>\n", adress, operation, operatorTag
                         ]; 

ASIHTTPRequest *asiRequest = [[ASIHTTPRequest alloc]initWithURL:[NSURL URLWithString:adress]];
[asiRequest setDelegate:self];
[asiRequest setURL:[NSURL URLWithString:adress]];
[asiRequest setTimeOutSeconds:30];
[asiRequest addRequestHeader:@"application/soap+xml; charset=utf-8" value:@"Content-Type"];
[asiRequest setRequestMethod:@"POST"];
[asiRequest setPostBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
[asiRequest startAsynchronous];

Это не сработает, если я заменю "parameters" на это: -

parameters = [NSMutableString stringWithFormat:@"<sessionId>%@</sessionId><resourcePath>%@</resourcePath><sku>%i</sku>", session, @"product.info", 12345];

Я получил сообщение об ошибке "Product not exists." и ошибку кода "101".

На некоторых форумах рекомендуется добавлять пробел после "12345" (SKU of Product), но это не работает.

Спасибо за помощь.

Edit: -
Я использую PHP для вызова веб-сервиса Magento, и он работает: -

$proxy = new SoapClient('xxx/api/?wsdl');
$sessionId = $proxy->login('userName', 'apiKey');
echo json_encode($proxy->call($sessionId, 'product.info', 111));

Так что теперь я уверен, что проблема в моем коде. Проблема (я думаю) заключается в части аргументов (-> <sku>%i</sku> <-), потому что, если я удалю эту часть, у меня будет та же ошибка. </p>

Есть идеи?

1 Ответ

0 голосов
/ 27 марта 2012

Пожалуйста, попробуйте "parameters" с этим утверждением: -

parameters = [NSMutableString stringWithFormat:@"<sessionId>%@</sessionId><resourcePath>%@</resourcePath><sku>%@</sku>", session, @"product.info", @"12345"];

Прежде всего, SKU должен рассматриваться как строка, потому что именно так Magento относится к SKU. Теперь, если вы внимательно посмотрите на определение WSDL для этого метода product.info в этой статье , вы обнаружите, что ему нужно 5 параметров: -

  • Идентификатор продукта или SKU (обязательно)
  • Идентификатор магазина или код (необязательно)
  • Список обязательных / загруженных атрибутов (необязательно)
  • Тип идентификатора (необязательно, но этот аргумент доступен в версии 1.5.1.0 Magento)

Теперь, если вы укажете только первый аргумент « Product ID или SKU » (который необходим), тогда все остальные аргументы будут установлены как NULL, при вызове этого метода product.info .
В таком вызове нет ошибки, но поскольку четвертый аргумент специально не упоминается как "sku" или "id", поэтому Magento пытается выяснить это, анализируя тип данных своего первого аргумента (будь то строка или целое число и т. д.). Все эти анализы проводятся по этому методу getProduct() этого класса Mage_Catalog_Helper_Product.

Так что я думаю, что вам нужно поместить значение SKU в виде строки в переменную parameters, чтобы Magento мог понять, что это строка и поэтому это SKU продукта.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...