2017-07-25 3 views
1

Je travaille sur un projet qui utilise AFNetworking pour se connecter avec l'interface API. Mon problème est que comment envoyer une demande au backend avec le contenu du corps qui comprend email, deviceId. J'ai trouvé beaucoup de solutions qui sont toutes compatibles avec AFNetworking 2.0 et non 3.0.AFNectworking 3.0 Envoyer Requête Contenu du corps

Maintenant, j'utilise SessionManager, lorsque j'initialise une requête, comment puis-je ajouter un contexte de corps de contenu?

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:nil]; 
NSString *stringData = [[NSString alloc]initWithData:jsonData encoding:NSASCIIStringEncoding]; 

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
[manager.requestSerializer setValue:@"application/x-www-form-urlencoded; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil]; 
[manager POST:_urlString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) { 
    NSString *link = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
    NSLog(@"JSON: %@",link); 
} failure:^(NSURLSessionTask *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

J'ai essayé de mettre & email deviceId dans [gestionnaire paramètre POST: Dict], mais il ne fonctionne pas.

Quelqu'un peut-il me dire comment ajouter du corps à AFNetworking 3.0? Merci

+0

Vous feriez mieux de créer votre propre singleton plutôt que d'utiliser le gestionnaire de AFNetworking. J'ai trouvé que son gestionnaire remplacera votre en-tête lors de la demande d'envoi, et le gestionnaire causera une fuite de mémoire. Vous pouvez implémenter votre manager. –

+0

@ S.Jin Pouvez-vous donner l'exemple? Je suis nouveau à ios & objectif c et je ne peux pas comprendre que –

+0

@JaniceZhan Vous pouvez hériter 'AFHTTPSessionManager' et créer un singleton. Comme ceci: '+ (instancetype) sharedManager { static MyManager * manager = nil; static dispatch_once_t pred; dispatch_once (& pred,^{ manager = [[auto-affectation] initWithBaseURL: [NSURL URLWithString: @ "http://baseURL.org/"]]; }); gestionnaire de retour; } '. Vous pouvez également définir votre champ d'en-tête lors de l'envoi de la requête ou dans la méthode init. –

Répondre

0

si j'ai eu votre question correctement, il ne devrait pas être si difficile. C'est similaire à la version 2.0.

NSDictionary *parameters = @{@"username": _username.text, 
          @"deviceId": deviceIdString, 

          }; 



NSMutableDictionary * parameters = [[NSMutableDictionary alloc]initWithDictionary:params]; 

    NSURL *baseURL = [NSURL URLWithString:@"http://url.com/ws/test.php"]; 

    AFHTTPSessionManager * manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

    [manager POST:@"" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { 

     //Response 

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 

     if(error.code==-1001){ 
      //Handle the error 

     } 

    }]; 
+0

Hmmm. Ça ne marche pas. Le résultat est nul. J'ai essayé la même requête sur Postman, et ça marche. –

+0

je tire ça du code de travail.hmm c'est bizarre. –

+0

vous ne recevez aucune exception non? –