使用带有UIWebView和POST请求的自定义NSURLProtocol

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:这个其他问题,在这里,我指向了解:

但我想知道是否有任何替代和/或更好的方式来实现我想要的东西.

Dan*_*ien 6

而不是试图用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/的响应的情况).