我使用以下代码第一次调用magento web服务,这是一个登录(我使用了this doc)
NSString *soapMessage = @" \
<?xml version=\"1.0\" encoding=\"UTF-8\"?> \
<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns1=\"urn:Magento\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"> \
<SOAP-ENV:Body> \
<ns1:login> \
<username xsi:type=\"xsd:string\">user</username> \
<apiKey xsi:type=\"xsd:string\">password</apiKey> \
</ns1:login> \
</SOAP-ENV:Body> \
</SOAP-ENV:Envelope>";
NSURL *url = [NSURL URLWithString:@"http://localhost/magentoPath/api/soap/?wsdl"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d",[soapMessage length]];
[request addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"localhost/magentoPath/" forHTTPHeaderField:@"SOAPAction"];
[request addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if(connection){
self.webData = [NSMutableData data];
}
else
NSLog(@"theConnection is null");
后来我有以下方法来记录我得到的响应。问题是,我总是获得 wsdl 的内容,但我应该从 magento 获得会话 ID。我做错了什么?谢谢!
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Done. received Bytes %d", [self.webData length]);
NSString *xml = [[NSString alloc] initWithBytes:[self.webData mutableBytes] length:[self.webData length] encoding:NSUTF8StringEncoding];
NSLog(xml);
}
顺便说一句,请求 xml 来自 PHP 的 SoapClient,登录正常。所以它与 Magento 无关。
所以我在查看magento的日志后自己找到了解决方案。它说不需要每次都声明xml,所以直接删除
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
根据请求,它有效!
尾随的
'?wsdl'
使服务返回其 WSDL 定义。如果您忽略这一点,您实际上会致电该服务。