iphone - afhttprequestoperation - AFNetworking 2.0 agrega encabezados a la solicitud GET
alamofire (7)
Aquí hay un ejemplo usando 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 2 líneas siguientes:
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];
Acabo de empezar a usar AFNetworking 2.0 y me preguntaba cómo incluí los encabezados en una solicitud HTTP Get. La documentación establece 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 NSURLRequests
no estoy seguro de cómo configurar las cabeceras HTTP.
Cualquier ayuda sería apreciada.
Saludos,
Micro
Esto es lo que creo que es una mejor opción. En algún momento, configure un AFHTTPSessionManager
utilizando NSURLSessionConfiguration
y luego use ese AFHTTPSessionManager
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];
He usado este formulario para hacer 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]);
}
];
Hice esto ... para aquellos que están pasando token
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=/"%@/"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];
La fantástica documentación para AFNetworking 2.0 hace que sea un poco difícil de encontrar, pero está ahí. En AFHTTPRequestSerializer
es AFHTTPRequestSerializer
Alternativamente, si sigue su enfoque recomendado de crear un administrador de sesión que se deriva de AFHTTPSessionManager
, esa clase puede anular un método para modificar encabezados en cada solicitud -dataTaskWithRequest:completionHandler:
Utilizo esto para inspeccionar las solicitudes y modificar encabezados caso por caso, y prefiero modificar el serializador, ya que mantiene la responsabilidad de la red contenida en ese administrador (y evita el borrado 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];
}
Use el siguiente código para poner cualquier tipo de valor de encabezado:
[[FRHTTPReqManager sharedManager].requestSerializer setValue:value forHTTPHeaderField:key];
la adición de respuestas y el serializador de solicitudes 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"];