Обработчики GCDWebServer для фоновой передачи файлов (не GCDWebUploader)
Кто-нибудь уже пытался реализовать обработчик для запросов GET (тот же вопрос для метода POST) без использования включенного (и классного) GCDWebUploader?
Мне нужен сервер для ответа на запрос GET http://local/download/filename.ext
загрузка файла клиенту.
Я соответствую запросу к коду "BackgroundSessionManager" (доступен здесь: AFNetworking 2.0 и фоновые передачи), и он отправляется и не вызывает проблем.
Журнал, который я получаю на стороне сервера, выглядит так:
[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 ответ
У меня был удален этот код, чтобы заставить его работать:
/*
// 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.
ОБНОВИТЬ
Чтобы добиться фоновой передачи файлов с помощью 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;
}];