2013-03-22 80 views
-1

在我當前的項目中,我需要調用基於REST的Web服務,我的同事創建了一個簡單的Web服務(nodeJS & express framework),它以json格式返回數據。我成功地使用NSUrlConnection來稱呼它。現在我的同事申請認證服務,首先我嘗試使用NSUrlConnection,然後AFNetworking,然後RestKit,但沒有成功。需要有關使用憑證調用REST Web服務的幫助

RestKit的搜索教程是舊的(restkit版本0.10)或沒有認證教程可用,我只想調用一個簡單的基於REST的Web服務與憑據。掙扎兩天需要幫助。

+0

檢查此鏈接希望它會幫助你http://stackoverflow.com/questions/1973325/nsurlconnection-and-basic-http-身份驗證 – Exploring 2013-03-22 11:14:17

+0

@sanjitshaw我需要POST基於... – 2013-03-22 11:23:05

+0

當你說AFNetworking沒有成功,你是如何使用它,你遇到什麼問題?您的朋友輸入了哪種類型的身份驗證? – 2013-03-22 11:54:11

回答

1

處理與RestKit 0.20 GET/POST請求/響應,你可以按照以下順序: -

在第一個與基地服務器URL配置RKObjectManager: -

RKObjectManager *manager = [RKObjectManager managerWithBaseURL:baseUrl]; 
[manager.HTTPClient setDefaultHeader:@"Accept" value:RKMIMETypeJSON]; 
manager.requestSerializationMIMEType = @"application/json"; 

由於RestKit總是處理用於請求和響應的對象,您必須創建一個包含您期望作爲響應的所有參數的對象。

@interface AuthenticationRequest : NSObject 
@property (nonatomic, copy) NSNumber *userName; 
@property (nonatomic, copy) NSString *password; 
@end 

@interface AuthenticationResponse : NSObject 
@property (nonatomic, copy) NSNumber *token; 
@property (nonatomic, copy) NSString *expiryDate; 
@property (nonatomic, copy) NSString *userId; 
@end 

然後使用服務器JSON響應中的鍵爲本地對象中的實例變量配置請求和響應映射。

注意:僅在POST或PUT請求的情況下配置請求映射。

RKObjectMapping *requestMapping = [RKObjectMapping mappingForClass:[AuthenticationRequest class]]; 
[requestMapping addAttributeMappingsFromDictionary:@{ 
       @"userName": @"userName", 
       @"password" : @"password", 
      }]; 


RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[AuthenticationResponse class]]; 
[responseMapping addAttributeMappingsFromDictionary:@{ 
       @"TOKEN": @"token", 
       @"expiryDate" : @"expiryDate", 
       @"USERID": @"userId" 
      }]; 

然後創建一個響應描述,將基於您通過它的pathPattern值本地對象執行服務器JSON對象的映射。以下列方式

[manager getObjectsAtPath:(NSString *)<rest of the path excluding the baseURL>    parameters:(NSDictionary *)parameters 
       success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success 
       failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure]; 

或執行服務器上的POST請求: - - :

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[AuthenticationResponse class] rootKeyPath:nil] 
[manager addRequestDescriptor:requestDescriptor]; 
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:<rest of the path excluding the baseURL> keyPath:nil statusCodes:nil]; 
    [manager addResponseDescriptor:responseDescriptor]; 

現在在服務器上以如下方式進行GET請求

[manager postObject:AuthenticationRequest 
       path:<rest of the path excluding the baseURL> 
      success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success 
      failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure]; 

成功與失敗塊將保持你的迴應處理。

如需更多幫助,您可以參考以下鏈接從RestKit: -

https://github.com/RestKit/RKGist/blob/master/TUTORIAL.md 
+0

非常感謝這麼精彩的回答。 – 2013-03-23 15:13:58

0

在NSURLConnectionDelegate

  • (無效)連接:(NSURLConnection的*)連接willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)挑戰;

方法將在那裏它會幫助你進行身份驗證。

+0

請提供一些詳細的代碼,我沒有成功做到這一點。 – 2013-03-22 11:20:48

0

憑證= [NSURLCredential credentialWithUser:密碼:密碼 持久性:NSURLCredentialPersistenceNone];

[[challenge sender] useCredential:憑證forAuthenticationChallenge:challenge];

1

顯然這已經爲Apple的本地HTTP方法解答了。我不知道你碰到了與AFNetworking但AFHTTPClient here可以很明顯的調用之一

- (void)setAuthorizationHeaderWithUsername:(NSString *)username 
            password:(NSString *)password; 

- (void)setAuthorizationHeaderWithToken:(NSString *)token; 

一個根據您的網絡服務是什麼的問題。由於RestKit建立在AFNetworking之上RKObjectManager有一個httpClient屬性,該屬性是AFHTTPClient的一個實例,因此您可以調用上面的方法(從here)。

然後你可以從here調用

- (void)postPath:(NSString *)path 
     parameters:(NSDictionary *)parameters 
     success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
     failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;