我有一个经过试验和测试使用的NSURLRequest(和伴奏)实现,这对GET有很大的作用,POST对于给定的URL.
不过,我想现在移动URL的目标,而不用更改应用程序使用的URL,因此我打算通过我的DNS提供商使用一个webhop重定向.
这对于GET请求可以正常工作,但POST只是挂起…没有收到连接响应.
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse
根据Apple的文档(handling redirects),
如果代理没有实现连接:willSendRequest:redirectResponse :,所有规范更改和服务器重定向都是允许的.
那么这不是我的经验,因为离开这个方法不适合我.该请求只是挂起没有响应.
苹果还建议执行willSendRequest(请参阅上面链接的Apple文档),这对我来说不起作用.我看到了调用,但结果的请求只是挂起.
我当前执行的willSendRequest如下(见下文).这遵循重定向,但是处理请求就像是GET,而不是POST.
我相信问题是重定向失去了HTTP请求是一个POST(可能会有更多的问题,如携带请求正文的问题)?
我不知道我应该在这里做什么所以任何关于如何正确处理接收重定向的POST的建议将不胜感激.谢谢.
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) redirectResponse; int statusCode = [httpResponse statusCode]; NSLog (@"HTTP status %d",statusCode); // http statuscodes between 300 & 400 is a redirect ... if (httpResponse && statusCode >= 300 && statusCode < 400) { NSLog(@"willSendRequest (from %@ to %@)",redirectResponse.URL,request.URL); } if (redirectResponse) { NSMutableURLRequest *newRequest = [request mutableCopy]; // original request [newRequest setURL: [request URL]]; NSLog (@"redirected"); return newRequest; } else { NSLog (@"original"); return request; } }
其他信息1
willSendRequest收到的HTTP代码是301 – “永久移动”.
使用allHTTPHeaderFields来提取标题字段,我看到他要求我最初提交的标题
HTTP header { "Content-Length" = 244; "Content-Type" = "application/json"; }
Redirect HTTP header { Accept = "*/*"; "Accept-Encoding" = "gzip,deflate"; "Accept-Language" = "en-us"; "Content-Type" = "application/json"; }
…它看起来不像原始请求的副本,甚至是超集.
解决方法
保留您的原始请求,然后提供您自己的willSendRequest:redirectResponse:定制该请求,而不是使用Apple提供的一个请求.
- (NSURLRequest *)connection: (NSURLConnection *)connection willSendRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)redirectResponse; { if (redirectResponse) { // The request you initialized the connection with should be kept as // _originalRequest. // Instead of trying to merge the pieces of _originalRequest into Cocoa // touch's proposed redirect request,we make a mutable copy of the // original request,change the URL to match that of the proposed // request,and return it as the request to use. // NSMutableURLRequest *r = [_originalRequest mutableCopy]; [r setURL: [request URL]]; return r; } else { return request; } }
通过这样做,您明确忽略了HTTP规范的某些方面:重定向通常应转为GET请求(取决于HTTP状态代码).但实际上,当从iOS应用程序POST时,这种行为将为您带来更好的效果.
也可以看看: