我正在从iPhone发送POST请求到webservice,这是一个基于SOAP的REST层。我收到错误408请求超时,在iPhone设备和模拟器上进行测试。在使用模拟器进行测试时,我注意到如果我首先从浏览器访问Web服务器,然后运行模拟器,问题就会消失并且通信正常。行为与此问题非常相似HTTP, 408 Request timeout 这是我用来创建POST请求的代码。有没有人遇到过这种行为,并找到了解决方案?
NSString * urlString = [NSString stringWithFormat:@"%@%@", kBaseURL,method];
NSURL * myURL = [NSURL URLWithString:urlString];
NSLog(@"URL %@", myURL);
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:myURL];
[theRequest setHTTPMethod:@"POST"];
[theRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[theRequest setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
[theRequest setTimeoutInterval:60]; // leave at default 60 secs
NSLog(@"Post Body: %@",body);
NSURLConnection *theConnection = [[NSURLConnection alloc]
initWithRequest:theRequest
delegate:self];
if( theConnection ) {
if (webData){
[webData release];
}
webData = [[NSMutableData data] retain];
NSLog(@"connection set up");
}
else {
NSLog(@"theConnection is NULL");
}
self.mainConnection=theConnection;
[theConnection release];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
答案 0 :(得分:2)
对不起我的英文,
我也面对这个问题。我的应用程序是一个调用Web服务的exe。 web服务使用apache cxf编码。然后,我收到一个错误“远程服务器在客户端返回了意外响应(408)请求超时”。但如果我首先从浏览器访问wsdl,我的exe成功运行。我还没有找到任何解决方案。我在调用webservice之前添加了代码。WebClient x = new WebClient();
string source = x.DownloadString("http://......../InfoOperations?wsdl");
if (source != "")
{
// Call your web method here...
}
它与浏览器做同样的事情。这解决了这个问题。但通常情况下,我们不需要添加此代码。
然后,我改变了webservise编码。我用过Axis2。但我的问题没有解决。 我认为这个问题与防火墙有关。
Connection to webservice times out first time
http://www.mustafakurkcu.com/java/230-cxfclientreturn408.html
答案 1 :(得分:1)
我最终找到了造成这种情况的原因。我尝试更改URL,发现我可以访问任何其他网站,但不能访问托管我需要与之通信的Web服务的网络服务器。我在3个不同的网络上测试了3G上的iPhone,所以这在我的本地网络上不是问题。我也尝试使用ASIHTTPRequest而不是NSURLConnection,这没有效果。如果我在同一设备上打开一个webbrowser并在尝试访问Web服务之前将其指向远程服务器,则该连接有效。
原来远程服务器没有正确处理POST请求,但它处理GET OK。浏览器使用GET,这就是为什么浏览器能够在我的Web服务(使用POST)时无法建立连接的原因。一个快速而讨厌的解决方法是发送GET请求并等到它完成后再尝试POST请求。