Как да задам HTTP тялото за заявка с помощта на AFNetworking?

В ранните версии на AFNetworking, ако трябваше да направя свой собствен персонализиран клиент, тогава просто щях да наследя от AFHTTPClient и да създам моите методи. В AFNetworking 2.0 вярвам, че трябва да наследя от AFHTTPSessionManager.

@interface MyCustomClient : AFHTTPSessionManager
    {

    }

В моята ситуация трябва да изпратя заявка като сапун. Това означава, че HTTP Body ще бъде сапун, а 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 *заявка; и задайте 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 за HTTPHeaderField:@Content-type]; [заявка setHTTPMethod:@POST]; [заявка setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; AFHTTPSessionManager *sManager = [[AFHTTPSessionManager alloc] init]; - person Anoop Vaidya; 28.10.2015
comment
` [sManager dataTaskWithRequest:(NSURLRequest *)request completionHandler:^( NSURLResponse *response, NSData *data, NSError *error){ NSLog(@%@, data); }];` - 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