Веб-служба AFNetworking + SOAP

У меня есть приложение, использующее веб-службу SOAP с использованием ASIHttpRequest, теперь я хочу (или имею) использовать другую сетевую структуру, и я выбрал AFNetworking, но не вижу, как я могу использовать SOAP, ее то, как я делаю с ASIHttpRequest:

NSString *operation=[NSString stringWithString:@"search_service"];
NSString *xmlNamespace=[NSString stringWithString:@"http://www.xxx.com/wsdl"];
NSString *address=[NSString stringWithString:@"http://www.xxx.com/service"];
NSString *parameters=[NSString stringWithFormat:@"<param1>%@</param1><param2>%@</param2>",
                      @"val1",
                      @"val2",
                      ];

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/addressing\" xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\n"
                         "  <s:Header>\n"
                         "    <To xmlns=\"http://www.w3.org/2005/08/addressing\">%@</To>\n"
                         "    <a:Action>http://tempuri.org/IService1/%@</a:Action>\n"
                         "  </s:Header>\n"
                         "  <s:Body>\n"
                         "    %@"
                         "  </s:Body>\n"
                         "</s:Envelope>\n", address, operation, operatorTag
                         ];

asiRequest = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:address]];
[asiRequest setDelegate:self];
[asiRequest addRequestHeader:@"application/soap+xml; charset=utf-8" value:@"Content-Type"];
[asiRequest setRequestMethod:@"POST"];
[asiRequest setPostBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
[asiRequest startAsynchronous];

Редактировать: вот что я пытаюсь сделать с AFNetworking:

NSString *operationWSDL= @"search_service";
NSString *xmlNamespace= @"http://www.xxx.com/wsdl";
NSString *address= @"http://www.xxx.com/service";
NSString *parameters=[NSString stringWithFormat:@"<param1>%@</param1><param2>%@</param2>",@"val1",@"val2",];


NSString *operatorTag = [NSString stringWithFormat:@"<%@ xmlns=\"%@\">%@</%@>\n", operationWSDL, xmlNamespace, parameters, operationWSDL];

NSString *soapMessage = [NSString stringWithFormat:
                         @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                         "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\n"
                         "  <s:Header>\n"
                         "    <To xmlns=\"http://www.w3.org/2005/08/addressing\">%@</To>\n"
                         "    <a:Action>http://tempuri.org/IService1/%@</a:Action>\n"
                         "  </s:Header>\n"
                         "  <s:Body>\n"
                         "    %@"
                         "  </s:Body>\n"
                         "</s:Envelope>\n", address, operationWSDL, operatorTag
                         ];

NSURL *url = [NSURL URLWithString:@"http://www.xxx.com/service"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
    [formData appendPartWithHeaders:[NSDictionary dictionaryWithObjectsAndKeys:@"application/soap+xml; charset=utf-8",@"Content-Type", nil] body:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];
[operation start];

person Red Mak    schedule 13.09.2012    source источник
comment
Что вы пробовали и что не сработало? Мы здесь, чтобы помочь, но где не здесь, чтобы написать код для вас.   -  person rckoenes    schedule 13.09.2012
comment
да, возможно, мой вопрос заставит вас задуматься об этом. я редактирую свой вопрос с тем, что я пытаюсь сделать.   -  person Red Mak    schedule 13.09.2012


Ответы (1)


Вы пробовали WSDL2Objc? http://code.google.com/p/wsdl2objc/. Я использовал его в своем проекте в последнее время. Он успешно генерирует классы (из потребляемого WSDL) для работы со службой SOAP. Я думаю, это будет лучшее решение.

person Rafael Kayumov    schedule 13.09.2012
comment
спасибо, я пробовал это раньше (в другом проекте-веб-сервисе), и он работал нормально, но с этим возвращаемое значение пусто, и я не могу ничего изменить на сервере, поэтому я прерываю это решение. - person Red Mak; 13.09.2012
comment
Предупреждение. Я пробовал WSDL2Objc с очень небольшим успехом. Поддержка ARC застряла в нерелизной ветке. Несколько WSDL, которые я использую, не сработают при создании кода. Последний релиз был почти 3 года назад. - person Nick N; 28.02.2013
comment
Попробуйте SudzC для автоматической генерации кода Objective-C ARC и WSDL без ARC. Я обнаружил, что это действительно работает очень хорошо. sudzc.com - person Jim Holland; 31.12.2013