我在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; - ),因为如果我删除这部分,我将会遇到同样的错误。
有什么想法吗?
答案 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 ”的第一个参数(这是必需的),那么在调用此方法时,所有其他参数将设置为NULL
product.info
。
这样的调用没有错误,但由于第四个参数没有被特别提及为"sku"
或"id"
,所以Magento试图通过分析其第一个参数的数据类型来找出它(是否它是字符串或整数,依此类推)。所有这些分析均以此类getProduct()
的此方法Mage_Catalog_Helper_Product
进行。
所以我认为你需要将SKU的值作为字符串放在parameters
变量中,以便Magento能够理解它是字符串&amp;所以这是产品SKU。
希望它有所帮助。