Какао HTTP PUT с диапазоном содержимого - PullRequest
3 голосов
/ 24 октября 2011

Можно ли использовать комбинацию NSURLConnection / NSURLRequest для отправки запроса PUT на сервер с заголовком Content-Range? Я имею в виду, что хочу возобновить загрузку на сервер, который может принять диапазон байтов в запросе на возобновление загрузки.

Я вижу, что вы можете установить NSInputStream в качестве тела запроса, поэтому я решил, что мог бы создать подкласс, переопределить функции открытия / поиска и установить заголовок запроса, но, похоже, он вызывает недокументированные селекторы и нарушает реализацию.

Я уверен, что мог бы сделать это с CFNetwork, но, похоже, должен быть способ сделать это с API более высокого уровня.

Есть идеи, с чего начать?

EDIT:

Чтобы ответить на мой собственный вопрос, это действительно возможно после прочтения блога [http://bjhomer.blogspot.com/2011/04/subclassing-nsinputstream.html], в котором подробно описываются недокументированные обратные вызовы, связанные с CFStream. Как только они будут реализованы, я могу вызвать следующее в open обратном вызове, чтобы пропустить:

CFReadStreamSetProperty((CFReadStreamRef)parentStream, kCFStreamPropertyFileCurrentOffset, (CFNumberRef)[NSNumber numberWithUnsignedLongLong:streamOffset]);

Спасибо, J

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

Я думаю, что сервер должен поддерживать метод put, комбинируемый с диапазоном, но это будет способ сделать это с помощью API Objective-C высокого уровня

        NSURL *URL = [NSURL URLWithString:strURL];
        NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:URL];
        NSString *range = [NSString stringWithFormat:@"bytes=%lld-%lld",bytesUploaded,uploadSize];
        [urlRequest addValue:range forHTTPHeaderField:@"Range"];
        [urlRequest setHTTPMethod:@"PUT"];
        self.connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];

Приветствия

2 голосов
/ 24 октября 2011

Во-первых, если вы хотите поработать с HTTP, я обычно рекомендую ASIHTTPRequest .Это солидный материал, который упрощает многие более сложные проблемы HTTP.На самом деле это не нужно для установки простого заголовка, но если вы начинаете создавать что-то более сложное, было бы неплохо перейти к ASI раньше, чем позже.

С NSMutableURLRequest вы можетеустановите любой заголовок, который вы хотите, используя addValue:forHTTPHeaderField:.Вы можете использовать это, чтобы установить Content-Range.

1 голос
/ 19 декабря 2011

Как я уже писал в своем комментарии, вы можете выполнять то, что хотите, не опускаясь до уровня CoreFoundation:

Поскольку NSInputStream наследует NSStream, можно подготовить поток следующим образом:

NSNumber *streamOffset = [NSNumber numberWithUnsignedInteger:lastOffset];

[inputStream setProperty:streamOffset forKey: NSStreamFileCurrentOffsetKey];

(Предполагается, что lastOffset - это NSUInteger представление вашего последнего смещения файла в байтах, а inputStream - это поток, который вы хотите установить как HTTPBodyStream.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...