0

Кто-нибудь уже пытался реализовать обработчик для запросов GET (тот же вопрос для метода POST) без использования включенного (и прохладного) GCDWebUploader?Обработчики GCDWebServer для передачи фонового файла (Not GCDWebUploader)

Мне нужен сервер для ответа на запрос GET http://local/download/filename.ext Загрузка файла клиенту.

Я согласен с запросом на код «BackgroundSessionManager» (доступно здесь: AFNetworking 2.0 and background transfers), и он отправляется и запускается без забот.

В журнале я получаю на стороне сервера читает так:

[DEBUG] Did start background task 
[DEBUG] Connection received 248 bytes on socket 14 
[DEBUG] Connection on socket 14 preflighting request "GET /download/file.ext with 248 bytes body 
[DEBUG] Connection on socket 14 processing request "GET /download/file.ext" with 248 bytes body 
[EXCEPTION] *** +[NSJSONSerialization dataWithJSONObject:options:error:]: value parameter is nil 
[DEBUG] Did close connection on socket 14 

Я не могу работать, как настроить обработчик для того, чтобы не заботиться о несуществующей запроса для разбора из JSON.

[webServer addHandlerForMethod:@"GET" path:@"/download" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { 
     __strong AppDelegate* strongSelf = weakSelf; 
     NSLog(@"request for download is %@", request); 

     return [strongSelf downloadFile:request]; 
    }]; 
+1

Это выглядит, как вы используют или добавляют обработчики в экземпляр GCDWebUploader вместо использования GCDWebServer. Это объясняет исключения NSJSONSerialization. – Pol

ответ

2

У меня был этот код удален для того, чтобы заставить его работать:

/* 
// Add a handler to respond to GET requests 
[webServer addDefaultHandlerForMethod:@"GET" 
          requestClass:[GCDWebServerRequest class] 
         asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { 

          __strong AppDelegate* strongSelf = weakSelf; 
..... 
*/ 

[webServer addHandlerForMethod:@"GET" path:@"/download" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { 
    __strong AppDelegate* strongSelf = weakSelf; 
    NSLog(@"request for download is %@", request); 

    return [strongSelf downloadFile:request]; 
}]; 

закомментирована обработчик по умолчанию, который берет снова и ожидающей пакет JSON в любом случае.

UPDATE

Для достижения фоновой передачи файлов с GCDWebServer и NSURLSessions (даже с AFNetworking) наилучшим образом для меня был экземпляр обработчика GET с MatchBlock следующим образом:

[webServer addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { 

     if (![requestMethod isEqualToString:@"GET"]) { 
      return nil; 
     } 
     if (![urlPath hasPrefix:@"/download"]) { 
      return nil; 
     } 
     return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; 

    } processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { 

     GCDWebServerResponse* response = nil; 

     NSString* filePath = [[weakSelf applicationDocumentsDirectory] stringByAppendingPathComponent:[[request.path stringByRemovingPercentEncoding]]; 
     NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType]; 
     if (fileType) { 
      if ([fileType isEqualToString:NSFileTypeRegular]) { 
        // always allow ranges in our requests 
        response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange]; 
        [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; 
      } 
     } 
     if (response) { 
      response.cacheControlMaxAge = 360; 
     } else { 
      response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound]; 
     } 
     return response; 

    }];