2011-03-09 138 views
0

我有一個基本問題,我希望有一個簡單的答案,我錯過了。基本前提是我要連接到一個網站並下載一些JSON數據。我正在使用Stig Brautaset提供的框架,該教程工作得很好。如何連接到需要用戶名和密碼的網站

我的問題是,我連接到的網站是格式和用戶名和密碼是固定的我的應用程序,所以用戶將永遠不會輸入它們。

curl -u username:password http://website.com/page 

如何將網址和密碼傳遞到NSURLConnection

它不一定是NSURLConnection,它似乎是最好的選擇。

我已經看過AdvancedUrlConnections樣本,但它看起來過於複雜並且相當陳舊。在網上搜索並沒有好多少。我希望你們中的一個人可以說只是設置這2個屬性,然後是適當的侮辱當然...

回答

3

的NSURLConnection的該-asBase64EncodedString方法會工作得很好。正如在另一個答案中指出的那樣,執行回調函數很容易。

- (void) someMethod 
{ 
    NSURLRequest* request = [[NSURLRequest alloc] 
     initWithURL:[NSURL urlWithString:@"someURL"] 

    NSURLConnection* connection = [[NSURLConnection alloc] 
     initWithRequest:request delegate:self]; 

    [connection release]; 
    [request release]; 
} 

這是非常簡單的。它在NSURLConnection的所有魔術發生的代表方法中:

這是處理憑證挑戰的地方。我已經硬編碼了一個假的用戶名和密碼來演示它的工作原理。我個人有一個單獨的委託對象處理挑戰。請記住,連接將處於空閒狀態,直到您響應或連接超時。

- (void) connection:(NSURLConnection *)connection 
     didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    // Make sure to use the appropriate authentication method for the server to 
    // which you are connecting. 
    if ([[challenge protectionSpace] authenticationMethod] == 
      NSURLAuthenticationMethodBasicAuth) 
    { 
      // This is very, very important to check. Depending on how your 
      // security policies are setup, you could lock your user out of his 
      // or her account by trying to use the wrong credentials too many 
      // times in a row. 
     if ([challenge previousFailureCount] > 0) 
     { 
      [[challenge sender] cancelAuthenticationChallenge:challenge]; 

      UIAlertView* alert = [[UIAlertView alloc] 
          initWithTitle:@"Invalid Credentials" 
            message:@"The credentials are invalid." 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
      [alert show]; 
      [alert release];  
     } 
     else 
     { 
      [challenge useCredential:[NSURLCredential 
        credentialWithUser:@"someUser" 
          password:@"somePassword" 
          persistence:NSURLCredentialPersistenceForSession 
      forAuthenticationChallenge:challenge]]; 
     } 
    } 
    else 
    { 
     // Do whatever you want here, for educational purposes, 
      // I'm just going to cancel the challenge 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
    } 
} 

你需要實現一個NSURLConnection的這些方法,以及:

// So you know when it's done downloading 
- (void) connectionDidFinishLoading:(NSURLConnection *)connection; 
// In case of failure 
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;  
// Gather the downloaded file data 
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
+0

感謝您的幫助。我使用了大部分示例代碼,但遇到了一些問題。首先是NSURLAuthenticationMethodBasicAuth無法識別,我剛剛評論說剛剛出來。另一個是forAuthenticationChallenge:挑戰]] ;.括號出來了,但沒有辦法,我會得到這麼遠沒有你的幫助,所以再次感謝。 – paulnug 2011-03-12 15:09:58

0

有幾種可能性。

如果使用異步NSURLConnection,則將在連接的委託上調用方法-connection:didReceiveAuthenticationChallenge:。該方法的文檔解釋瞭如何處理它。這是AdvancedUrlConnections的用途,是的,這有點混亂。

更簡單的方法是在創建連接時創建NSMutableURLRequest(而不是不可變的NSURLRequest)。這使您可以添加任意的HTTP標頭。構建基本的認證報頭是simple--像

NSMutableURLRequest *request = .... // details omitted 
NSString *username = // .... 
NSString *password = // .... 
NSData *authRawData = [[NSString stringWithFormat:@"%@:%@", username, password] dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *authEncoded = [authRawData asBase64EncodedString]; 
[request setValue:[NSString stringWithFormat:@"Basic %@", authEncoded] forHTTPHeaderField:@"Authorization"]; 

以上使用包含在TouchFoundation

+0

強制性安全備註:請確保您的連接是SSL加密。 – 2011-03-10 01:23:48

+0

我嘗試了以上,但從服務中得到錯誤。這不是一個SSL加密的視線,所以我認爲這可能是問題。謝謝你的幫助。我現在更瞭解這個過程。 – paulnug 2011-03-12 15:12:10

+0

錯誤是好的,如果他們是信息。一個很好的錯誤信息會導致您找到解決方案。至少它不只是默默地失敗。 – 2011-03-14 16:47:50

相關問題