2012-04-30 125 views
1

我有一個奇怪的問題。所以我一直在用戶可以登錄的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

回答

0

感謝@ 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

相關問題