Acabo de comenzar a usar AFNetworking 2.0 y me preguntaba cómo coloco encabezados en una solicitud HTTP Get. La documentación configura un GET como este:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Pero como no estamos manejando, NSURLRequests
no estoy seguro de cómo configurar los encabezados HTTP.
Cualquier ayuda sería apreciada.
Saludos,
Mike
iphone
ios
objective-c
afnetworking
afnetworking-2
Mackey18
fuente
fuente
setDefaultHeader
apesta. Una búsqueda de 30 segundos de los documentos y encuentro que AFHTTPRequestSerializer es responsable de HTTPHeaders por solicitud.manager.requestSerializer setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>
Respuestas:
La fantástica documentación de AFNetworking 2.0 hace que sea un poco difícil de encontrar, pero está ahí. En el
AFHTTPRequestSerializer
es-setValue:forHTTPHeaderField:
.Alternativamente, si sigue su enfoque recomendado de crear un administrador de sesión que se derive de
AFHTTPSessionManager
esa clase, esa clase puede anular un método para modificar los encabezados en cada solicitud-dataTaskWithRequest:completionHandler:
. Utilizo esto para inspeccionar las solicitudes y modificar los encabezados caso por caso, y lo prefiero a modificar el serializador, ya que mantiene la responsabilidad de la red contenida en ese administrador (y evita la contaminación con singletons)- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler { static NSString *deviceId; if(!deviceId) { deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; } NSMutableURLRequest *req = (NSMutableURLRequest *)request; // Give each request a unique ID for tracing NSString *reqId = [NSString stringWithFormat:@"%@+%@", deviceId, [[NSUUID UUID] UUIDString] ]; [req setValue:reqId forHTTPHeaderField:"x-myapp-requestId"]; return [super dataTaskWithRequest:req completionHandler:completionHandler]; }
fuente
nil
forvalue
lo eliminará. No debería usar encabezados para pasar valores efímeros del cliente al servidor, eso es parte de su carga útil. Los encabezados son para valores que no cambian con frecuencia, como datos de autenticación, control de caché, etc. Algunos servidores incluso determinarán si deben devolver los datos almacenados en caché basándose en la coincidencia de los parámetros del encabezado, lo que no querrá evitar accidentalmente. Si necesita establecer encabezados solo para solicitudes individuales, sospecho que son datos que pertenecen a la carga útil.Aquí hay un ejemplo con AFNetworking 2.0
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; [manager.requestSerializer setValue:@"calvinAndHobbesRock" forHTTPHeaderField:@"X-I do what I want"]; [manager GET:@"http://localhost:3000" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }];
La clave son las siguientes 2 líneas:
manager.requestSerializer = [AFJSONRequestSerializer serializer]; [manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];
fuente
Agregar respuesta y serializador de solicitud resolvió mi problema.
manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
fuente
He utilizado este formulario para concertar una cita con un encabezado específico.
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; [operationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [operationManager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [operationManager POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { if (success) { success(responseObject); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", [error description]); } ];
fuente
Esto es lo que creo que es la mejor opción. En un singleton en algún lugar, configure un
AFHTTPSessionManager
usando unNSURLSessionConfiguration
, y luego utilíceloAFHTTPSessionManager
cada vez que desee realizar una solicitud.NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"}; mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];
fuente
Hice esto ... para aquellos que están pasando token
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];
fuente
Utilice el siguiente código para poner cualquier tipo de valor de encabezado:
fuente