替代尝试使用 POST 请求,一种解决方法是继续对myprotocol://
URL 使用 GET 请求,但在您的NSURLProtocol
实现中将它们转换为使用请求查询字符串作为 POST 正文的对您的服务器http://
的POST 请求。
使用 GET 请求发送大量数据的担忧在于,在请求链的某个地方,请求行可能会被截断。但是,对于本地实现的协议,这似乎不是问题。
我编写了一个简短的 Cordova 测试应用程序进行实验,我发现我能够毫无问题地发送超过 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/的响应的情况)。