需要有关使用凭据调用REST Web服务的帮助

时间:2013-03-22 11:03:55

标签: ios objective-c nsurlconnection restkit afnetworking

在我目前的项目中,我需要调用基于REST的Web服务,我的同事创建了一个简单的Web服务(nodeJS& express框架),它以json格式返回数据。我使用NSUrlConnection成功调用它。现在,我的同事将身份验证应用于服务,首先我尝试使用NSUrlConnection然后AFNetworking然后RestKit但未成功。

RestKit的搜索教程是旧版本(restkit版本0.10)或者没有可用的身份验证教程,我想要做的就是使用凭据调用基于REST的简单Web服务。需要帮助奋斗两天。

4 个答案:

答案 0 :(得分:1)

显然,Apple的本机HTTP方法已经回答了这个问题。我不确定您在AFNetworking中遇到了哪些问题,但在AFHTTPClient here中您显然可以调用其中一个

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

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

取决于您的网络服务。由于RestKit构建于AFNetworking之上RKObjectManager有一个httpClient属性是AFHTTPClient的一个实例,因此您也可以调用上面的方法(来自here

然后你可以打电话

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

来自here

答案 1 :(得分: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对象与本地对象的映射。

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 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请求: -

[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

答案 2 :(得分:0)

在NSURLConnectionDelegate

  
      
  • (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
  •   

方法将帮助您进行身份验证。

答案 3 :(得分:0)

  

凭证= [NSURLCredential credentialWithUser:userName密码:passWord                                                持久性:NSURLCredentialPersistenceNone];

     

[[challenge sender] useCredential:凭证forAuthenticationChallenge:challenge];