Как установить тело HTTP для запроса с помощью AFNetworking?

В ранних версиях AFNetworking, если мне нужно было создать свой собственный клиент, я просто наследовал от AFHTTPClient и создавал свои методы. Я считаю, что в AFNetworking 2.0 мне нужно наследовать от AFHTTPSessionManager.

@interface MyCustomClient : AFHTTPSessionManager
    {

    }

В моей ситуации мне нужно отправить запрос как мыло. Это означает, что HTTP Body будет soap, а HTTP HEADERS будет text/xml.

Допустим, у меня есть переменная, содержащая все тело мыла, которое мне нужно отправить на сервер.

NSString *soapBody = @"Soap body";

Используя мой пользовательский класс, определенный выше, который наследуется от AFHTTPSessionManager, как я установлю мыльное тело в Request HTTPBody.

Если в любом случае есть доступ к NSURLRequest из AFHTTPSessionManager, то я могу просто выполнить setHTTPBody, но, похоже, нет?

Надеюсь, теперь я имею смысл!


person john doe    schedule 12.02.2014    source источник


Ответы (2)


Вы должны создать подкласс AFHTTPRequestSerializer, а затем реализовать протокол AFURLRequestSerialization, этот класс будет заботиться о добавлении тела и заголовков к запросу.

 - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                                withParameters:(id)parameters
                                         error:(NSError * __autoreleasing *)error
{
     NSParameterAssert(request);

     if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
         return [super requestBySerializingRequest:request withParameters:parameters error:error];
     }

     NSMutableURLRequest *mutableRequest = [request mutableCopy];

     [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
         if (![request valueForHTTPHeaderField:field]) {
             [mutableRequest setValue:value forHTTPHeaderField:field];
         }
     }];


     [mutableRequest setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
     [mutableRequest setHTTPBody:@"This is the soap Body!!"];

     return mutableRequest;
}

Вы можете прочитать реализацию или другие подклассы AFHTTPRequestSerializer https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLRequestSerialization.m#L1094

person JE Herrejon    schedule 12.02.2014
comment
Но мыльный корпус может быть разным для разных вызовов. Также нет способа сделать это без подкласса. Я думаю, что AFNetworking 2.0 плохо спроектирован. - person john doe; 12.02.2014
comment
Проблема в том, что в Objective-C нет собственного способа создания тела мыла, вы можете заставить этот класс построить правильное тело, прочитав WSDL или создав шаблоны тел. - person JE Herrejon; 12.02.2014
comment
Это правильный подход. @johndoe Ты ошибаешься. AFNetworking идеально подходит для этого. Дополнительные параметры метода могут использоваться для кодирования любой дополнительной информации, необходимой для построения тела SOAP. - person mattt; 13.02.2014

Инициируйте NSMutableURLRequest *request; и установите httpBody для запроса: [request setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

Вы можете попробовать этот код.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestURL]];
    request.HTTPMethod = @"POST";
    [request setValue:@"application/soap+xml;charset = utf-8" forHTTPHeaderField:@"Content-Type"];
    request.HTTPBody = [soapMessage dataUsingEncoding:NSUTF8StringEncoding];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
    NSURLSessionDataTask *sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
              if (!error) {
                  // parse response here
              } else {
                  // error
              }
          }];
    [sessionTask resume];

надеюсь, это поможет Вам.

person larva    schedule 12.02.2014
comment
Я пробовал следующее: но это не сработало. Я что-то пропустил, пожалуйста, посмотрите: NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@tempuri.org /]]; [запрос setValue:@text/xml forHTTPHeaderField:@Content-type]; [запрос setHTTPMethod:@POST]; [запрос setHTTPBody: [данные soapMessageUsingEncoding: NSUTF8StringEncoding]]; AFHTTPSessionManager *sManager = [[AFHTTPSessionManager alloc] init]; - person Anoop Vaidya; 28.10.2015
comment
` [sManager dataTaskWithRequest: (NSURLRequest *) обработчик завершения запроса: ^ ( NSURLResponse * ответ, NSData * данные, NSError * ошибка) { NSLog (@% @, данные); }];` - person Anoop Vaidya; 28.10.2015
comment
Вы можете увидеть правильные коды в этом вопросе - person Anoop Vaidya; 28.10.2015
comment
@AnoopVaidya с вашим вопросом, кажется, что-то не так с форматом XML. что такое символ 'n' в финале в ‹soap:Envelope.../\›n и ‹/soap:Envelope›n”? - person larva; 29.10.2015