【问题标题】:Having trouble doing a POST request with RESTKit使用 RESTKit 执行 POST 请求时遇到问题
【发布时间】:2017-08-17 09:44:49
【问题描述】:

我正在尝试使用 RESTKit 发布一些数据(具体来说是网站的身份验证令牌),但遇到了问题。每次我运行该方法时,我都会得到:

'NSInvalidArgumentException', reason: '`RKRequestDescriptor` objects must be initialized 
with a mapping whose target class is `NSMutableDictionary`, got 'Login' (see 
`[RKObjectMapping requestMapping]`)'

此外,代码中有许多“不兼容的指针类型”警告。

这是我的方法,它非常丑陋和糟糕,我需要一些帮助来解决。当按下按钮时,我在 IBAction 方法中执行[self postToken]。我从另一个文件中获取变量 userAuthToken,该文件是使用来自 POST 请求的 json 响应设置的,而不是使用 RESTKit。当我知道如何成功时,我最终会将该 POST 转换为 RESTKit。 “userAuthTokenMethod”方法与“postToken”方法在同一个文件中,它允许我使用在 AppDelegate 中初始化的 userAuthToken 对象,因此它充当全局变量。

- (void)postToken
{        
    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Login class]];
    [mapping addAttributeMappingsFromDictionary:@{@"token": @"token"}];
    NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
    RKResponseDescriptor *tokenResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:nil pathPattern:nil keyPath:nil statusCodes:statusCodeSet];
    RKRequestDescriptor *tokenRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:self rootKeyPath:nil method:nil];
    [[RKObjectManager sharedManager] addRequestDescriptor:tokenRequestDescriptor];
    RKObjectManager *tokenManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"https://websitetest.com/doctors/find"]];
    [tokenManager addResponseDescriptor:tokenResponseDescriptor];
    [tokenManager addRequestDescriptor:tokenRequestDescriptor];
    [tokenManager postObject:[[self userAuthTokenMethod] userAuthToken] path:nil parameters:nil success:nil failure:nil];


    NSURL *tokenURL = [NSString stringWithFormat:@"https://websitetest.com/doctors/find?name=%@&location=%@",nameIDTextField.text, locationTextField.text];
    NSMutableURLRequest *tokenRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:tokenURL]];
    RKObjectManager *tokenObjectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:tokenURL]];
    [tokenObjectManager.HTTPClient setDefaultHeader:@"Auth-Token" value:[[self network360Edge] userAuthToken]];
    RKObjectRequestOperation *tokenOperation = [[RKObjectRequestOperation alloc] initWithRequest:tokenRequest responseDescriptors:@[tokenResponseDescriptor]];
    NSLog(@"Token being POSTed ==> %@", [[self userAuthTokenMethod] userAuthToken]);
    [tokenOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result){
        NSLog(@"Response for POST request with token ==> %@", [result array]);
    }failure:nil];
    [tokenOperation start];
}

这是我的映射提供程序文件 MappingProvider 的代码:

//MappingProvider.h
#import <Foundation/Foundation.h>
#import <RestKit/RestKit.h>

@interface MappingProvider : NSObject

+(RKMapping *)tokenMapping;

@end

//MappingProvider.m
#import "MappingProvider.h"
#import <RestKit/RestKit.h>
#import "Login.h"

@implementation MappingProvider

+(RKMapping *)tokenMapping
{
    RKObjectMapping *tokenMapping = [RKObjectMapping mappingForClass:[Login class]];
    [tokenMapping addAttributeMappingsFromArray:@[@"token"]];
    return tokenMapping;
}

@end

这是初始化“令牌”的登录文件的代码:

//Login.h
#import <Foundation/Foundation.h>

@interface Login : NSObject

@property (nonatomic, copy)NSString *token;

@end

我对 RESTKit 很陌生,对 Objective-C 也有些陌生(我已经用它编码了大约一个月)。我将不胜感激在修复我的代码方面的所有帮助。

【问题讨论】:

  • 我认为您不应该在 ResponseDescriptor 中使用 nil 代替 keypath。相反,您可以使用空字符串。并尝试将 ResponseDescriptor 中的请求方法设置为适用的 RKRequestMethodPOST/GET。此外,由于 RKObjectManager 是一个共享类,您可以通过向 RKObjectManager 和 TokenManager 添加描述符来多次添加相同的响应描述符。
  • 删除将 tokenRequestDescriptor 添加到 [RKObjectManager sharedManager] 的行。
  • 我和你有同样的问题,我想知道你的问题解决了吗?

标签: ios objective-c restkit restkit-0.20


【解决方案1】:

这个问题很老,但问题是请求应该使用没有类规范的映射,因为请求使用指定类的描述符(参见下面的 2 行),如下所示:

RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];

可能你也有问题:

RKRequestDescriptor *tokenRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:self rootKeyPath:nil method:nil];

更具体的objectClass:self应该是objectClass:[self class]或者需要的包含token属性的类,比如这个:

RKRequestDescriptor *tokenRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[self class] rootKeyPath:nil method:nil];

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2019-11-19
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多