Ich habe gerade angefangen, AFNetworking 2.0 zu verwenden, und ich habe mich gefragt, wie ich Header in eine HTTP-Get-Anfrage eingefügt habe. In der Dokumentation wird ein GET wie folgt eingerichtet:
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);
}];
Aber da wir nicht damit umgehen, NSURLRequests
bin ich mir nicht sicher, wie ich HTTP-Header setzen soll.
Jede Hilfe wäre dankbar.
Grüße,
Mike
iphone
ios
objective-c
afnetworking
afnetworking-2
Mackey18
quelle
quelle
setDefaultHeader
saugt. Eine 30-sekündige Suche in den Dokumenten und ich finde, dass AFHTTPRequestSerializer für HTTPHeaders pro Anfrage verantwortlich ist.manager.requestSerializer setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>
Antworten:
Die fantastische Dokumentation für AFNetworking 2.0 macht es etwas schwierig, dies zu finden, aber es ist da. Auf dem
AFHTTPRequestSerializer
ist-setValue:forHTTPHeaderField:
.Wenn Sie dem empfohlenen Ansatz zum Erstellen eines Sitzungsmanagers folgen, der von diesem abgeleitet
AFHTTPSessionManager
ist, kann diese Klasse alternativ eine Methode zum Ändern von Headern für jede Anforderung überschreiben-dataTaskWithRequest:completionHandler:
. Ich verwende dies, um Anforderungen zu prüfen und Header von Fall zu Fall zu ändern, und ziehe es vor, den Serializer zu ändern, da er die Verantwortung für das in diesem Manager enthaltene Netzwerk behält (und das Durcheinander mit Singletons vermeidet).- (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]; }
quelle
nil
for aufruft,value
entfernt sie. Sie sollten keine Header verwenden, um kurzlebige Werte vom Client an den Server zu übergeben - das ist Teil Ihrer Nutzlast. Header sind für Werte gedacht, die sich nicht häufig ändern, z. B. Authentifizierungsdaten, Cache-Steuerung usw. Einige Server bestimmen anhand der übereinstimmenden Header-Parameter sogar, ob zwischengespeicherte Daten zurückgegeben werden sollen, was Sie nicht versehentlich verhindern möchten. Wenn Sie Header nur für einzelne Anforderungen festlegen müssen, sind vermutlich Daten in der Nutzlast enthalten.Hier ist ein Beispiel mit 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); }];
Der Schlüssel sind die folgenden 2 Zeilen:
manager.requestSerializer = [AFJSONRequestSerializer serializer]; [manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];
quelle
Das Hinzufügen eines Antwort- und Anforderungsserialisierers löste mein Problem.
manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
quelle
Ich habe dieses Formular verwendet, um einen Termin mit einem bestimmten Header zu vereinbaren.
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]); } ];
quelle
Hier ist, was ich für die beste Option halte. Konfigurieren Sie in einem Singleton irgendwo ein
AFHTTPSessionManager
using aNSURLSessionConfiguration
und verwenden Sie dieses dannAFHTTPSessionManager
jedes Mal , wenn Sie eine Anfrage stellen möchten.NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"}; mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];
quelle
Ich habe das getan ... für diejenigen, die Token weitergeben
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];
quelle
Verwenden Sie den folgenden Code, um einen beliebigen Headerwert einzugeben:
quelle