0

含まれている(そしてクールな)GCDWebUploaderを使用せずに、GETリクエスト(POSTメソッドと同じ質問)のハンドラーを実装しようとした人はいますか?

http://local/download/filename.extファイルをクライアントにアップロードする GET リクエストにサーバーが応答する必要があります。

リクエストをコード「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];
    }];
4

1 に答える 1

3

機能させるために、このコードを削除しました。

/*
 // 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 を使用しても) バックグラウンドでファイル転送を行うには、次のように MatchBlock を使用して GET ハンドラーをインスタンス化するのが最善の方法でした。

[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;

    }];
于 2014-12-26T00:38:02.140 に答える