如何从发送的请求中检索服务器的响应?

时间:2009-07-06 05:07:12

标签: iphone

我正在开发一个连接到远程Web服务器并经常与Web服务器交换数据的应用程序。我的应用程序的第一个屏幕提供验证用户身份的登录屏幕。

我能够通过向服务器发送请求但无法从服务器获得响应来向Web服务器上的用户进行身份验证,以向iphone上的用户显示成功警报。很明显,我没有得到任何回应。

我使用的服务器是用Java开发的。

我使用以下命令将请求发送到服务器。

NSString *post = @"username=";

post = [post stringByAppendingString:username];
post = [post stringByAppendingString:@"&password="];
post = [post stringByAppendingString:password];

NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:@"http://example.com/login.action?"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];

而且,

- (void)connectionNSURLConnection *)connection didReceiveDataNSData *)data
{
[receivedData appendData:data];
NSString *ReturnStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"In \"didReceiveData()\" : receivedData = %@",receivedData);
NSLog(@"Return String : %@", ReturnStr);

}

永远不会调用此函数。

我应该怎么做才能收到我发送的请求的回复?

我的查询的简要集合:

示例:验证Java服务器中用户的登录屏幕

  1. 我发送的请求是我能够在服务器应用程序的控制台上看到的。
  2. 我无法收到请求的回复。
  3. 必须以哪种格式发送响应数据?
  4. 有人会提供iPhone应用程序和Java servlet之间数据交换的清晰图片吗?

    更新

    我也实现了这三种方法。但没有来自服务器的回应。您能否指导我开发通过请求和响应与JAVA服务器通信的LOGIN应用程序的过程?我坚持沟通。

    是的,我的服务器正在接收来自iphone的请求。我能够看到发送到服务器的请求。

    我无法理解iphone应用程序和JAVA服务器之间的数据交换是如何发生的。我是这款iphone开发的新手。

6 个答案:

答案 0 :(得分:1)

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSString *failureMessage = [NSString stringWithFormat:@"Connection failed: %@", [error description]];
    NSLog(failureMessage);

}

尝试实现这三种方法,您可能会收到错误或没有响应。您可以使用这些方法来判断。

答案 1 :(得分:0)

您应该验证服务器是否实际收到了来自iphone的请求。 一个简单的PHP脚本应该返回一些东西。

<?php

    echo print_r($_GET, true);
    echo print_r($_POST, true);
?>

创建一个虚拟应用程序,向脚本发出请求并显示响应

答案 2 :(得分:0)

我不确定您使用LOGIN引用的身份验证,但如果服务器需要HTTP身份验证,则需要实现委托方法

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

答案 3 :(得分:0)

  

我使用以下命令将请求发送到服务器。

代码看起来不错,但是这段代码在哪里以及你向我们展示的代码之前和之后会发生什么?它是按钮按下的处理程序吗?它是在后台线程吗?

对于您正常使用的异步加载,您需要使用默认运行循环的线程,例如:主线程。而且这段代码必须将控制权返回给运行循环,即一定不要忙着等待其他事情。

要检查的另一件事是您的服务器 - 它实际上是在发送响应吗?如果您从浏览器发送相同的请求,您会得到什么内容长度?

编辑:如果你还在服务器端显示java动作处理程序,它可能会有所帮助。例如,如果登录成功,它是否会发送HTTP重定向?您是否正在实施以下委托方法:

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse

......如果是的话,该方法是什么样的。我想知道你是否可能实现了这种方法而没有在那里得到正确的逻辑,从而阻止了重定向的发生。

答案 4 :(得分:0)

答案 5 :(得分:0)

你可以这样做......

-(NSString* )createWebServiveRequest:(NSString *)urlLink{
   NSURL *url = [NSURL URLWithString:urlLink];
   NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
   NSData *returnData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse: nil error: nil ];
   NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
   return responseString;
}

使用包含url的NSString调用上述方法,并在方法调用中捕获它。