2016-04-12 8 views
0

Ich habe viele Stunden damit verbracht, die verschiedenen Ideen, die in Posts zu dieser Frage gefunden wurden, ohne Erfolg zu testen. Wenn ich curl verwende bekomme ich die gewünschte Kopfzeile: Content-Length.So erhalten Sie NSURLSession, um die Inhaltslänge (HTTP-Header) vom Server zurückzugeben. Objective-c, ios

Hier ist mein neuester Versuch (irgendwo auf SO gefunden):

- (void) trythis { 

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL]; 
    request.HTTPMethod = @"HEAD"; 


    NSURLSessionDownloadTask *uploadTask 
     = [session downloadTaskWithRequest:request 
       completionHandler:^(NSURL *url,NSURLResponse *response,NSError *error) { 
        NSLog(@"handler size: %lld", response.expectedContentLength); 
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; 
        NSDictionary* headers = [httpResponse allHeaderFields]; 
        NSArray *keys = [headers allKeys]; 
        for(NSString *key in keys){ 
         NSLog(@"key: %@ : %@", key, [headers valueForKey:key]); 
        } 
        NSLog(@""); 

       }]; 

    // 5 
    [uploadTask resume]; 
} 

Es gibt diese Header:

Schlüssel: Vary: Accept-Encoding, User-Agent Schlüssel: Server: Apache/2.4.12 Schlüssel: Verbindung: Keep-Alive Schlüssel: Zuletzt geändert: Sa, 13 Jun 2015 23:03:46 GMT Schlüssel: Content-Type: audio/mpeg Schlüssel: Accept-Ranges: Bytes Schlüssel: Datum: Di, 12. April 2016 17.59.21 GMT Schlüssel: Content-Encoding: gzip

Mit curl (auf macbook) erhalte ich:

curl -I http://boulderhomegrown.com/fiddletunes/JerusalemRidge-100.mp3

HTTP/1.1 200 OK Datum: Di, 12 Apr 2016 14:55:17 GMT Server: Apache/2.4.12 Zuletzt geändert: Sa, 13 Jun 2015 23:03:46 GMT ETag: "2ec0bc0-1a172e -5186e3ca6b55f " Accept-Ranges: Bytes Content-Length: 1.709.870 Vary: Accept-Encoding, User-Agent Content-Type: audio/mpeg

HINWEIS des Content-Length !! Und natürlich ist die URL in beiden gleich. Es ist eine Instanzvariable in meinem Ziel-c.

+0

Was war falsch mit 'response.expectedContentLength', wie Sie es benutzt haben? – jtbandes

+0

Es kam -1 zurück. –

+0

Sieht so aus, als ob Ihr curl-Befehl eine GET-Anfrage und Ihre NSURLSession eine HEAD-Anfrage macht. Was passiert, wenn Sie 'request.HTTPMethod = @" HEAD ";'? – EricS

Antwort

1

Standardmäßig hat die Anfrage, die Sie senden, Header - Accept-Encoding: gzip, deflate und der Server-Apache fügen in diesem Fall nicht die Header-Inhaltslänge hinzu (standardmäßig für größere Dateien). Wenn Sie also diesen Header mit value: identity ersetzen. Es wird die richtige Größe der Datei bereitstellen. Hier

ist der Code:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:myURL]; 
request.HTTPMethod = @"HEAD"; 
[request addValue:@"identity" forHTTPHeaderField:@"Accept-Encoding"]; 

Nur müssen das Feld hinzufügen, und Sie werden die richtigen Header in der Antwort wie curl haben -I tut.

+0

Kaloyan, dies führt dazu, dass die Antwort den Header Content-Length enthält; danke, eine Nachfolgefrage: Der NSURL * im CompletionHandler zeigt auf eine tmp-Datei auf dem Gerät. Wurde die Datei hochgeladen, findest du?Ich habe kein Tool, um dieses Verzeichnis anzuzeigen. –

Verwandte Themen