为什么我的iPhone应用程序无法连接到我的服务器?

问题描述:

我有一个奇怪的问题。所以我一直在用户可以登录的iphone应用程序上工作,登录后,应用程序会通过向服务器发出http GET请求来授权用户。如果用户名和密码正确,它会返回授权令牌(典型的东西)。为什么我的iPhone应用程序无法连接到我的服务器?

奇怪的是,当我在本地测试这个,指向我的本地机器的http请求url,它工作正常。一切正常授权,所有数据正确返回。

但今天,我得到的应用足够稳定,我决定部署休息api到我的服务器,但是当http请求url更改为我的服务器url时,请求失败。

我想也许服务器没有正确部署,所以我测试了与Firefox的休息客户端的http端点和一切似乎工作,授权作品,并返回数据。

有没有人有任何想法?我失去了什么问题可能。

我正在使用AFNetworking库来提出请求。

这里是我的代码:

self.apiHttpClient = [[TKRHttpClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://mywebsite.com/api"]]; 

-------------- 

NSString *username = [usernameField text]; 
NSString *password = [passwordField text]; 
TKRHttpClient *httpClient = [TKRHttpClient sharedInstance]; 
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"/user/auth" parameters:nil]; 
[request addValue:username forHTTPHeaderField:@"username"]; 
[request addValue:password forHTTPHeaderField:@"password"]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    if(response.statusCode == 200){ 
     NSDictionary * headers = [response allHeaderFields]; 
     NSString *token = [headers objectForKey:@"auth_token"]; 
     NSLog(@"token was %@", token); 
     [[AppController sharedAppController] initializeDataForUserToken:token]; 
    }else{ 
     NSLog(@"upload failed!"); 
    } 
} failure:^(NSURLRequest *request , NSHTTPURLResponse *response , NSError *error , id JSON) { 
    NSLog(@"code was: %i", response.statusCode); 
    if(response.statusCode == 401){ 
     [errorMessage setText:@"Incorrect password or username"]; 
    } 
}]; 
[operation start]; 

我把破发点,似乎该请求,可直接到达不良区。 “NSLog(@”代码是:%i“,response.statusCode);”在失败块打印出200.但是当我尾巴我的服务器上的日志,没有收到请求。

任何帮助将不胜感激。不知道为什么它会对我的本地tomcat有效,但在部署到我的服务器时无法工作。

在此先感谢!

+2

数据包嗅探连接,或通过像Fiddler这样的代理运行手机,并查看发生了什么。 – Brad

+1

如果我正确读取您的代码,则您将不带(https)加密的用户名和密码作为GET参数发送。这意味着任何嗅探连接的人都可以窃取用户的凭据 – TheRealKingK

+0

辉煌的布拉德!为什么我没有想到这一点..我完全按照你所说的做了,但是用了查尔斯。我发现了这个问题。我会发布答案。再次感谢布拉德。 @TheRealKingK好眼睛。我现在只是在原型阶段。我打算很快拿到ssl证书。 – Khon

感谢@ Brad的建议,我找到了我的问题的原因。

查看查尔斯的请求后,我发现请求是作为“http://mywebsite.com”,然后路径是/ user/auth。所以“/ api”部分丢失了。

也许这是标准,我不知道,但似乎AFHTTPClient的(我的TKRHttpClient扩展AFHTTPClient)initWithBaseURL真的意味着主机的URL。 “/ api”部分被截断。

,为什么它是在本地工作的原因是因为我在本地部署的应用程序的根,所以没有“/ API”

所以两种方法来解决这个问题。 1.以root身份重新部署为应用程序到服务器。或是2.更换的代码行:

NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"/user/auth" parameters:nil]; 

TO:

NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"api/user/auth" parameters:nil]; 

希望这有助于在未来使用AFNetworking任何人。

+0

这在'AFHTTPClient'中有记录。如果您的'baseURL'包含一个路径,则传递给客户端的任何绝对路径参数将覆盖初始路径。所以在你的情况下,只需用'@“user/auth”'替换'@“/ user/auth”'就可以了。 – mattt