3

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

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

4

3 回答 3

5

使用如下代码时:

@implementation AppProtocolHandler

+ (void)registerSpecialProtocol {
    静态 BOOL 初始化 = 否;

    如果(!初始化){
        初始化=是;
        [NSURLProtocol registerClass:[AppProtocolHandler 类]];
    }
}

- (void)handleRequest {
    NSURLRequest *request = [自我请求];

    // 通过 app:// 时为空,但通过 http:// 时有效
    NSLog(@"[请求 HTTPBody]: %@", [请求 HTTPBody]);
}

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    返回是;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    退货请求;
}

@结尾

对某些协议(例如 )的请求app://将导致. 但是,如果您通过发送,那么将按预期在对象中包含请求数据。[request HTTPBody]nullhttp://[request HTTPBody]NSData

所以你的 Javascript 应该是这样的:

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

不是这样的:

$.post("app://test/hello/world", {'data':"foo bar"});
于 2010-10-24T20:59:04.510 回答
1

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

$.post("toobjc.html", { 'data':"这里有 10k 个字符长的字符串等等..." });

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

于 2010-10-21T23:48:20.947 回答
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];

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

于 2010-10-21T20:13:38.013 回答