В SudzC генерируется SoapRequest.m:
- (void) connectionDidFinishLoading:(NSURLConnection *) connection {
...
if(self.logging == YES){
NSString* response = [[NSString alloc] initWithData: self.receivedData
encoding: NSUTF8StringEncoding];
NSLog(@"%@", response);
}
...
}
Ответ является необработанным ответом SOAP и содержит ожидаемые данные.
В том же методе
CXMLNode* element = [[Soap getNode: [doc rootElement] withName: @"Body"]
childAtIndex:0];
Эта строка получает возвращаемое значение из ответа SOAP.После некоторого осмотра выясняется, что проблема заключалась в «Body»:
Ответ SOAP имеет «S: Body», поэтому изменение с помощью name на правильное имя тега исправляет все.
Это беспокоитмне, так как я не знаю, виноват ли мой WS или что-то еще, но я сейчас возьму его.
Кроме того, Soap.m, возможно, придется изменить, так как он использует "мыло" вместо, скажем, "soapenv" .Эти значения жестко запрограммированы, но изменение довольно простое.
Кроме того, пространство имен остается пустым:
[s appendFormat:@"=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns=\"%@\">", ns];
Это может быть xmlns: [namespace] = \ "%@ "... где пространство имен - это разделенное пространство имен.
То есть:
http://namespace/ => namespace
Кроме того, вы не можете получить строковый результат и использовать его, как в примерах, по крайней мере, с моей стороны.Например:
NSString* result = (NSString*) value;
должно выдавать ноль.Однако, похоже, это работает:
NSDictionary* result = (NSDictionary*)value;
NSString* finalResult = [[result allValues] objectAtIndex:0];
Если кому-то интересно, вот изменения к Soap.m, которые я сделал.
// Soap.m
NSString* const SOAP_PREFIX = @"soapenv";
NSString* const HTTP_PREFIX = @"http://";
NSUInteger const FORWARD_FLASH_CHARACTER_VALUE = 47;
// Creates the XML request for the SOAP envelope with optional SOAP headers.
+ (NSString*) createEnvelope: (NSString*) method forNamespace: (NSString*) ns
forParameters: (NSString*) params withHeaders: (NSDictionary*) headers
{
NSMutableString* s = [NSMutableString string];
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
[s appendString: @"<"];
[s appendString: SOAP_PREFIX];
[s appendString:@":Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-
instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""];
[s appendString:@" xmlns:"];
[s appendString: SOAP_PREFIX];
NSString* rawNamespace = [Soap getRawNamespace:ns];
[s appendFormat:@"=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:%@=\"%@\">", rawNamespace, ns];
if(headers != nil && headers.count > 0) {
[s appendString: @"<"];
[s appendString: SOAP_PREFIX];
[s appendString:@":Header>"];
for(id key in [headers allKeys]) {
if([[headers objectForKey: key] isMemberOfClass: [SoapNil class]])
{
[s appendFormat: @"<%@ xsi:nil=\"true\"/>", key];
} else {
[s appendString:[Soap serializeHeader:headers forKey:key]];
}
}
[s appendString: @"</"];
[s appendString: SOAP_PREFIX];
[s appendString:@":Header>"];
}
[s appendString: @"<"];
[s appendString: SOAP_PREFIX];
[s appendString:@":Body>"];
NSMutableString* fullMethodName = [NSMutableString string];
[fullMethodName appendString:rawNamespace];
[fullMethodName appendString:@":"];
[fullMethodName appendString:method];
[s appendFormat: @"<%@>%@</%@>", fullMethodName,[params
stringByReplacingOccurrencesOfString:@"&" withString:@"&"],
fullMethodName];
[s appendString: @"</"];
[s appendString: SOAP_PREFIX];
[s appendString:@":Body>"];
[s appendString: @"</"];
[s appendString: SOAP_PREFIX];
[s appendString:@":Envelope>"];
return s;
}
+(NSString*)getRawNamespace:(NSString *)value{
if([value hasPrefix:HTTP_PREFIX]){
NSString* rawNamespace = [value substringFromIndex:([HTTP_PREFIX length])];
if([rawNamespace length] == 0){
return @"";
}
// strip out a trailing slash
if([rawNamespace characterAtIndex:([rawNamespace length]- 1)] ==
FORWARD_FLASH_CHARACTER_VALUE){
NSRange range = NSMakeRange (0, [rawNamespace length] - 1);
rawNamespace = [rawNamespace substringWithRange:(range)];
}
return rawNamespace;
}
else{
return value;
}
}