bch*_*mes 10 iphone uiwebview nsurlprotocol ios
在我的iOS应用程序中,我使用的是UIWebView和自定义协议(使用我自己的NSURLProtocol实现).我一直非常小心确保每当我加载一个url时,我将这样的内容加载到我的UIWebView中:
myprotocol:// MYSERVER/mypath中
在我的NSURLProtocol实现中,我获取NSURLRequest的可变副本,将URL转换为http:并将其发送到我的服务器.
一切都适用于HTTP GET请求.我遇到的问题是POST请求.如果请求使用我的自定义协议,似乎UIWebView没有正确编码HTTPBody中的表单数据.
一个解决方法,因为我使用HTTPS来处理我的服务器请求,就是我注册我的协议处理程序来拦截http:而不是myprotocol:我可以将所有调用转换为https:这个其他问题,在这里,我指向了解:
但我想知道是否有任何替代和/或更好的方式来实现我想要的东西.
而不是试图用POST请求,一个解决办法是继续使用GET请求myprotocol://的URL,但在你的改造他们NSURLProtocol实施的http:// ,并使用请求的查询字符串作为POST的主体POST请求到服务器.
使用GET请求发送大量数据的担心是在请求链的某个地方,请求行可能会被截断.然而,这似乎不是一个问题,使用本地实现的协议.
我写了一个简短的Cordova测试应用程序进行实验,我发现我能够毫不费力地向HTTP请求回送服务发送超过1 MiB的数据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];
}
}
Run Code Online (Sandbox Code Playgroud)
然后我实现了NSURLConnection协议方法以转发到适当的NSURLProtocolClient方法,但是在建立响应数据的情况下Transfer-Encoding:chunked(如http://http-echo.jgate.de/的响应的情况).