2013-03-22 56 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;