Magento Web服务“product.info”错误:产品不存在

时间:2012-03-26 10:54:47

标签: iphone web-services api magento

我在iPhone应用程序中遇到Magento Web服务(Magento版本1.6.0.0)的问题。事实上,我可以登录并拥有带有此代码的产品列表(产品列表代码): -

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)之后添加一个空格,但这不起作用。

感谢您的帮助。

编辑: -
我使用PHP来调用Magento Web服务,它可以工作: -

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

所以现在我确定问题出现在我的代码中。 问题(我认为)是参数部分( - &gt; <sku>%i</sku>&lt; - ),因为如果我删除这部分,我将会遇到同样的错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

请使用以下声明尝试“parameters”: -

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

首先,SKU必须被视为一个字符串,因为这就是Magento对待SKU的方式。现在,如果仔细查看this article中此方法product.info的WSDL定义,您会发现它需要5个参数: -

  • 产品ID或SKU(必填)
  • 商店视图ID或代码(可选)
  • 必需/加载属性列表(可选)
  • 标识符类型(可选,但此参数可从Magento 1.5.1.0版获得)

现在,如果您只提供“产品ID或SKU ”的第一个参数(这是必需的),那么在调用此方法时,所有其他参数将设置为NULL product.info
这样的调用没有错误,但由于第四个参数没有被特别提及为"sku""id",所以Magento试图通过分析其第一个参数的数据类型来找出它(是否它是字符串或整数,依此类推)。所有这些分析均以此类getProduct()的此方法Mage_Catalog_Helper_Product进行。

所以我认为你需要将SKU的值作为字符串放在parameters变量中,以便Magento能够理解它是字符串&amp;所以这是产品SKU。

希望它有所帮助。