在我的iOS应用程序中,我正在使用UIWebView和一个自定义协议(使用我自己的NSURLProtocol实现)。我一直非常谨慎地确保每当我加载URL时,我都会将类似的东西加载到我的uiwebview中:

myprotocol:// myserver/mypath

在我的NSURLProtocol实施中,我采用了Nsurlrequest的可变副本,将URL转换为HTTP:并将其发送到我的服务器。

一切都适用于HTTP获取请求。我遇到的问题是邮政请求。如果请求使用我的自定义协议,则似乎UIWebView无法正确编码HTTPBody中的表单数据。

一个工作障碍,因为我正在为服务器请求使用HTTPS,是我注册了我的协议处理程序以拦截HTTP:而不是MyProtocol:并且我可以将所有调用转换为HTTPS:另一个问题, 这里, ,向我指向该解决方案:

但是我想知道是否有其他选择和/或更好的方法来完成我想要的东西。

有帮助吗?

解决方案

而不是尝试使用发布请求,而是要继续使用获取请求 myprotocol:// URL,但是将它们转换为您的 NSURLProtocol 实施到一个 http:// 使用请求查询字符串作为帖子正文将请求发布到您的服务器。

使用GET请求发送大量数据的担忧是,沿请求链的某个地方,请求行可能会被截断。但是,对于本地实施协议,这似乎不是问题。

我写了一个简短的Cordova测试应用程序进行实验,发现我能够通过1个超过1个MIB的数据发送而没有麻烦的HTTP请求回声服务 http://http-echo.jgate.de/

这是我的 startLoading 执行:

- (void)startLoading {
    NSURL *url = [[self request] URL];
    NSString *query = [url query];
    // Create a copy of `url` without the query string.
    url = [[[NSURL alloc] initWithScheme:@"http" host:@"http-echo.jgate.de" path:[url path]] autorelease];
    NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:url];
    [newRequest setHTTPMethod:@"POST"];
    [newRequest setAllHTTPHeaderFields:[[self request] allHTTPHeaderFields]];
    [newRequest addValue:@"close" forHTTPHeaderField:@"Connection"];
    [newRequest addValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    [newRequest setHTTPBody:[query dataUsingEncoding:NSUTF8StringEncoding]];
    urlConnection = [[NSURLConnection alloc] initWithRequest:newRequest delegate:self];
    if (urlConnection) {
        receivedData = [[NSMutableData data] retain];
    }
}

然后我实施了 NSURLConnection 协议方法可以转发到适当的 NSURLProtocolClient 方法,但是在 Transfer-Encoding:chunked (就像来自 http://http-echo.jgate.de/).

其他提示

不幸的是看起来那样 http:https: 方案请求的处理方式与基础框架的其他(包括自定义)方案的处理方式略有不同。明显地 HTTPBodyHTTPBodyStream 有关相关的电话 NSURLRequest 始终返回 nil 对于以前的。这是决定已经事先召集的 [NSURLProtocol canInitWithRequest] 因此 NSURLProtocol 实施无法影响这种情况(为时已晚)。

似乎有所不同 NSURLRequest 课程用于 http:https: 而不是“默认一个”。此类的默认gnustep实现返回 总是 nilHTTPBodyHTTPBodyStream 呼叫。因此,特定的实现(例如,在电话盖上的一个,可能是基础框架的一部分)选择 NSURLRequest基于方案的课堂类型 NSURLProtocol. 。对于自定义方案,您会得到 NSURLRequest 返回 nil 对彼此而言 HTTPBodyHTTPBodyStream 在自定义URI方案处理程序中,有效地禁用使用Post方法(以及其他与身体的方法)。

也许有一种方法如何影响决策 NSURLRequest 实际上是使用课程,但目前对我来说是未知的。

作为解决方法,您仍然可以使用 http: 或者 https: 计划并决定 [NSURLProtocol canInitWithRequest] 根据其他条件(例如主机名)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top