Как прочитать тело формы POST-запроса GCDWebServer - PullRequest
0 голосов
/ 30 января 2020

Я изо всех сил пытаюсь поверить, что это так сложно, но потратив пару часов, пытаясь понять это, здесь я прошу улей за помощь!

Мой вопрос очень похож на этот один, однако ответы там не помогают мне, поскольку у меня нет ключей в моей форме. Я в основном хочу отправить текстовый файл .plist из P C в мое приложение. HTML на странице - это ..

<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" id="config" name="config" accept=".plist" size=40>
<input type="submit"> 
</form>

Это дает очень простую форму с кнопкой выбора файла и кнопкой отправки. С помощью Wireshark я подтвердил, что файл прикреплен к форме, и в моем приложении он размещен на GCDWebServer. Я также вижу следующее подтверждающее данные тела, когда загрузка файла обрабатывается веб-сервером:

[DEBUG] Соединение с запросом предварительной проверки сокета 21 «POST / upload» с телом 2045 байтов

[DEBUG] Соединение при обработке запроса сокета 21 «POST / upload» с телом 2045 байтов

Мой метод POST для обработки файла такой:

    [_webServer addHandlerForMethod:@"POST"
                          path:@"/upload"
                  requestClass:[GCDWebServerRequest class]
                   processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {

        NSString    *type = [(GCDWebServerRequest*)request contentType];
        NSInteger  length = [(GCDWebServerRequest*)request contentLength];
        BOOL      hasBody = [(GCDWebServerRequest*)request hasBody];

    NSString *description = [(GCDWebServerURLEncodedFormRequest*)request description];

    NSLog(@"\r\nType: %@\nLength: %lu\nHas Body: %@\nHeaders: %@\nConfig: %@", type, length, hasBody?@"YES":@"NO", description, @"");

        return [GCDWebServerDataResponse responseWithHTML:@"TODO UPLOADED CONFIRMATION"];
    }];

Я могу получить тип содержимого, длину содержимого, логическое подтверждение, к которому прикреплено тело, все заголовки и описание границ и т. Д. c. Но я не могу за свою жизнь понять, как получить фактическое содержание тела. Я не могу sh сохранить его как файл, я просто хочу его как NSString, чтобы я мог его проанализировать и затем сохранить настройки внутри моего приложения.

Несколько вещей, которые я пробовал:

//NSData     *data = [(GCDWebServerRequest*)request data];
//NSString *config = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

//NSString *config = [(GCDWebServerMultiPartFormRequest*)request files];
//NSString *config = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"filename"];

Мне больше всего нравится NSData, но приложение вызывает его при вызове. Если кто-нибудь знает, как я могу получить доступ к телу этого размещенного контента, я был бы очень признателен!

Заранее спасибо!

Plasma

1 Ответ

2 голосов
/ 31 января 2020

Вы захотите использовать GCDWebServerMultiPartFormRequest. Вот пример в https://github.com/swisspol/GCDWebServer/blob/master/Mac/main.m#L257.

...