我一直在使用url拦截方法将数据从javascript传递到目标C,方法是将数据作为url编码参数传递,并使用NSURLProtocol来拦截请求但是我现在想要发送更大量的数据,比如10,000个字符长字符串,但这在GET请求中似乎不切实际。正确?
目标c是否有办法拦截从UIWebView发送的POST数据? 如果是这样,我仍然使用NSURLProtocol,如何获取POST数据? 如果没有,我可以通过其他方式将大量数据从UIWebView传递到目标c?
答案 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个字符长字符串,此处更多...”});
答案 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];
或者,您可以发送多部分文档或表单值。