Передача данных в цель c с помощью POST, а не GET - PullRequest
3 голосов
/ 21 октября 2010

Я использовал метод перехвата url для передачи данных из javascript в цель C, передавая данные в качестве параметров, закодированных в url, и используя NSURLProtocol для перехвата запроса, однако сейчас я хочу отправить большие объемы данных, например, скажем, длиной 10000 символовстроки, но это не кажется практичным сделать в запросе GET.Правильно?

Есть ли способ для цели c перехватывать данные POST, отправленные из UIWebView?
Если это так, я все еще использую NSURLProtocol и как мне получить данные POST?
Если неткаким-то другим способом я могу передать большие объемы данных из UIWebView для цели c?

Ответы [ 3 ]

5 голосов
/ 25 октября 2010

При использовании кода типа:

@implementation AppProtocolHandler

+ (void)registerSpecialProtocol {
    static BOOL inited = NO;

    if (!inited) {
        inited = YES;
        [NSURLProtocol registerClass:[AppProtocolHandler class]];
    }
}

- (void)handleRequest {
    NSURLRequest *request = [self request];

    // null when via app:// but works when via http://
    NSLog(@"[request HTTPBody]: %@", [request HTTPBody]);
}

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    return YES;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

@end

Запросы к некоторым протоколам (например, app://) приведут к [request HTTPBody], равному null. Но если вы отправите через http://, то [request HTTPBody] будет иметь данные запроса в NSData объекте, как и ожидалось.

Так что ваш Javascript должен выглядеть примерно так:

$.post("http://test/hello/world", {'data':"foo bar"});

А не что-то вроде:

$.post("app://test/hello/world", {'data':"foo bar"});
1 голос
/ 22 октября 2010

Любой запрос будет перехвачен делегатом, поэтому вы можете отправить любой запрос POST Ajax, заполнить его нужными параметрами и значениями и затем отправить его. Все значения будут перехвачены, и вы можете использовать их так же, как и до сих пор. Простой запрос POST может быть отправлен с использованием JQuery, просто:

$. Post ("toobjc.html", {'data': "строка длиной 10k символов и многое другое здесь ..."});

Подробнее здесь: http://api.jquery.com/jQuery.post/

0 голосов
/ 22 октября 2010

Вы обязательно должны использовать POST. Вам просто нужно настроить запрос на это. Возможно, вам необходимо убедиться, что данные закодированы, и позаботиться о нескольких других деталях.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:myMimeType forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", requestData.length]       
         forHTTPHeaderField:@"Content-Length"];

[request setHTTPBody:requestData];

[self.playerView loadRequest: request];

Кроме того, вы можете отправить документ из нескольких частей или значения формы.

...