在Objective-C中调用Magento SOAP API时出错

我正在尝试在Objective-C iOS中使用Maginto SOAP API。 我可以调用loginAPI,并获得SessionID,但当我尝试调用其他API的相同的SessionID,那么它给我下面的错误。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>5</faultcode><faultstring>Session expired. Try to relogin.</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope> 

我不明白为什么这个错误信息在那里。 如果有人知道解决scheme,那么请帮助我。

先谢谢你。

这是我的login代码 –

 -(void)make_call_to_maginto_api_login{ NSString *soapMessage = @" \ <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> \ <apiUser xsi:type=\"xsd:string\">UserName</apiUser> \ <apiKey xsi:type=\"xsd:string\">Password</apiKey> \ </ns1:login> \ </SOAP-ENV:Body> \ </SOAP-ENV:Envelope>"; NSURL *url = [NSURL URLWithString:@"http://www.hostname.com/index.php/api/v2_soap/"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%lu",(unsigned long)[soapMessage length]]; [request addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request addValue:@"http://www.hostname.com/login" 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"); }} 

如果有人有解决scheme,那么请分享,这对我来说真的很好。 谢谢 :)

寻找解决scheme后,我已经解决了这个问题我自己的。 我已经做了SOAP请求的变化,现在它的工作正常。

谢谢。

这里是创buildMagento Envelope请求的方法和发出SOAP请求的方法。

 - (NSString *)createEnvelope:(NSString *)method forNamespace:(NSString *)ns forParameters:(NSString *)params{ NSMutableString *s = [NSMutableString string]; [s appendString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; [s appendFormat:@"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns1=\"%@\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:ns2=\"http://xml.apache.org/xml-soap\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">", ns]; [s appendString:@"<SOAP-ENV:Body>\n"]; [s appendFormat:@"<%@>%@</%@>", method, [params stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"], method]; [s appendString:@"</SOAP-ENV:Body>"]; [s appendString:@"</SOAP-ENV:Envelope>"]; return s;} -(void)login_request{ NSString *parameters = [NSString stringWithFormat:@"<username xsi:type=\"xsd:string\">%@</username><apiKey xsi:type=\"xsd:string\">%@</apiKey>",login_name,login_pwd]; NSString *envelope = [self createEnvelope:@"login" forNamespace:@"urn:Magento" forParameters:parameters]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.YOUR_HOST_NAME.com/index.php/api/v2_soap/"]]; //?wsdl=1 [request setHTTPMethod:@"POST"]; NSMutableDictionary *defaultHeaders = [[NSMutableDictionary alloc] init]; [defaultHeaders setValue:@"gzip" forKey:@"Accept-Encoding"]; [defaultHeaders setValue:@"en, en-us;q=0.8" forKey:@"Accept-Language"]; [defaultHeaders setValue:@"text/xml; charset=utf-8" forKey:@"Content-Type"]; [defaultHeaders setValue:@"urn:Mage_Api_Model_Server_HandlerAction" forKey:@"SOAPAction"]; [defaultHeaders setValue:@"com.lognllc.Magento-iOS-Example/1.0.0 (unknown, iPhone OS 8.1, iPhone Simulator, Scale/2.000000)" forKey:@"User-Agent"]; [request setAllHTTPHeaderFields:defaultHeaders]; [request setHTTPBody:[envelope dataUsingEncoding:NSUTF8StringEncoding]]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if(connection) { self.webData = [NSMutableData data]; } else { NSLog(@"theConnection is null"); } }