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

标签 ios objective-c magento soap

我正在尝试在 Objective-C iOS 中使用 Maginto SOAP API。我可以调用登录 API 并获取 SessionID,但是当我尝试调用具有相同 SessionID 的其他 API 时,它会出现以下错误。

<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>

我不明白为什么会出现此错误消息。如果有人知道解决方案,请帮助我。

提前谢谢你。

这是我的登录码-

-(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");
}}

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

最佳答案

在搜索了很多解决方案之后,我自己解决了这个问题。我已经对 SOAP 请求进行了更改,现在它工作正常。

谢谢。

这是创建 Magento 信封请求的方法和触发 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");
    }
}

关于ios - 在 Objective-C 中调用 Magento SOAP API 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26710966/

相关文章:

php - 未定义索引 : _attribute_set in magento product csv import from admin

ios - 无法在 Firebase 上上传 iOS APNs 证书

ios - Swift 格式化速度

objective-c - 当我不需要使用完成 block 时,如何在 swift 中声明 NULL/Void?

ios - AFNetworking AFHTTPSessionManager POST 调用了两次

ios - 使用 MAC ios 连接到 BLE 设备

magento - SEOmoz 显示 10k+ 爬网错误 - 302 重定向问题,magento 1.6 和 1.7

php - 自定义报告Magento中与时区的区别

iphone - 在触摸时更改条形按钮项目的选择器

objective-c - 一次设置所有 UITextField 的样式而不是在每个 ViewController 中设置样式?