使用POST而不是GET将数据传递到目标c

时间:2010-10-21 19:54:31

标签: javascript objective-c uiwebview nsurlprotocol

我一直在使用url拦截方法将数据从javascript传递到目标C,方法是将数据作为url编码参数传递,并使用NSURLProtocol来拦截请求但是我现在想要发送更大量的数据,比如10,000个字符长字符串,但这在GET请求中似乎不切实际。正确?

目标c是否有办法拦截从UIWebView发送的POST数据? 如果是这样,我仍然使用NSURLProtocol,如何获取POST数据? 如果没有,我可以通过其他方式将大量数据从UIWebView传递到目标c?

3 个答案:

答案 0 :(得分:5)

使用以下代码时:

@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 :(得分:1)

任何请求都将被委托拦截,因此您可以发送任何POST Ajax请求,并使用您想要的参数和值填充它,然后发送它。所有值都将被拦截,您可以按照与目前相同的方式使用它们。 可以使用JQuery发送简单的POST请求,这很简单:

$ .post(“toobjc.html”,{'data':“10k个字符长字符串,此处更多...”});

更多信息:http://api.jquery.com/jQuery.post/

答案 2 :(得分:0)

你绝对应该使用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];

或者,您可以发送多部分文档或表单值。