【问题标题】:Passing data to objective c with POST rather than GET使用 POST 而不是 GET 将数据传递给目标 c
【发布时间】:2011-04-28 19:52:24
【问题描述】:

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

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

【问题讨论】:

  • phonegap 是否向目标 C 发送大量(相对)数据?如果有,他们是怎么做到的?

标签: javascript objective-c uiwebview nsurlprotocol


【解决方案1】:

当使用如下代码时:

@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] 成为null。但是,如果您通过http:// 发送,那么[request HTTPBody] 将在NSData 对象中按预期包含请求数据。

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

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

不是类似:

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

【讨论】:

  • 那是我的问题。当我切换到 http:// 时,我能够获取帖子数据。谢谢!
  • 哇,太棒了。实际上是否有一个地方记录了这一点,或者您只是通过反复试验发现了它?这真的很难追踪
  • 我已经很长时间没有使用这个了,但据我所知,这是很多尝试和错误。
【解决方案2】:

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

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

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

【讨论】:

  • 我知道如何发出帖子请求。我的问题是客观 c 是否可以像使用 NSURLProtocol 拦截发布请求一样拦截发布数据。
  • 它可以截取发布的数据,它们将在: - "(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ NSData * data = [request HTTPBody]; . . . }" - 在数据变量中。
【解决方案3】:

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

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

【讨论】:

  • 这将从目标 C 发送一个 POST。我正在寻找的是一种让目标 C 拦截在 UIWebView 中创建的 POST 和 POST 数据的方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多