web-dev-qa-db-fra.com

Comment imprimer une demande AFNetworking en tant que données RAW

Pour des raisons de débogage, j'aimerais imprimer le corps de la requête dans son intégralité. J'utilise AFHTTPClient. Le client d’impression donne des informations, comme les en-têtes, mais les paramètres post/get ne sont pas là. 

Y a-t-il un moyen de le faire?

25
Jacek Kwiecień

Outils AFNetworking intégrés

Pour AFNetworking 1.x, utilisez AFHTTPRequestOperationLogger .

Pour AFNetworking 2.x, utilisez AFNetworkActivityLogger .

Ces outils utilisent tous les deux la variable NSNotification diffusée par AFNetworking pour consigner les données de requête et de réponse sur la console. La quantité d'informations à afficher est configurable et peut être configurée pour ignorer certaines opérations.

Examen dans Xcode sans ces outils

Requêtes HTTP (données sortantes)

Si vous souhaitez examiner le corps d'une requête sortante, examinez le paramètre NSURLRequest de HTTPBody, qui est une propriété de votre AFHTTPRequestOperation.

Par exemple, dans la méthode -[AFHTTPClient getPath: parameters: success: failure:], une fois la demande effectuée, vous pouvez le saisir dans le débogueur:

po [[NSString alloc] initWithData:request.HTTPBody encoding:4]

4 est NSUTF8StringEncoding, tel que défini dans NSString.h.

Le paramètre NSURLRequest de HTTPMethod fournit la méthode (GET, POST, PUT, etc.) sous la forme d'une NSString.

Réponses HTTP (données entrantes)

Lorsque votre serveur répond, un objet AFHTTPRequestOperation (appelé operation par défaut) est transmis à votre bloc d'achèvement de réussite. Vous pouvez:

  • p (int)[[operation response] statusCode] pour voir le code d'état
  • po [[operation response] allHeaderFields] pour voir les en-têtes
  • po [operation responseString] pour voir le corps de la réponse 
  • po [operation responseObject] pour voir l'objet de réponse (qui peut être nil s'il ne peut pas être sérialisé)
37
Aaron Brager

Depuis AFNetworking 2.0, vous devez utiliser AFNetworkActivityLogger

#import "AFNetworkActivityLogger.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#ifdef DEBUG
    [[AFNetworkActivityLogger sharedLogger] startLogging];
    [[AFNetworkActivityLogger sharedLogger] setLevel:AFLoggerLevelDebug];
#endif
    return YES;
}

Si vous utilisez 3.0 et CocoaPods, vous devrez également extraire AFNetworkActivityLogger de la branche appropriée:

pod 'AFNetworkActivityLogger', git: 'https://github.com/AFNetworking/AFNetworkActivityLogger.git', branch: '3_0_0'
20
Zee

Vous devriez consulter https://github.com/AFNetworking/AFHTTPRequestOperationLogger avec AFLoggerLevelDebug comme niveau de débogage.

#import "AFHTTPRequestOperationLogger.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#ifdef DEBUG
    [[AFHTTPRequestOperationLogger sharedLogger] startLogging];
    [[AFHTTPRequestOperationLogger sharedLogger] setLevel:AFLoggerLevelDebug];
#endif
    return YES;
}

@end
17
Benjamin Toueg

Pour que AFNetworking 3.0 puisse définir le niveau de journalisation, vous avez besoin des éléments suivants:

#import <AFNetworkActivityLogger/AFNetworkActivityLogger.h>
#import <AFNetworkActivityLogger/AFNetworkActivityConsoleLogger.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    AFNetworkActivityConsoleLogger *logger = [AFNetworkActivityLogger sharedLogger].loggers.anyObject;
    logger.level = AFLoggerLevelDebug;
    [[AFNetworkActivityLogger sharedLogger] startLogging];

    return YES;
}
0
Alex