【问题标题】:Restkit failed to post objectRestkit 未能发布对象
【发布时间】:2015-04-28 09:51:42
【问题描述】:

我一直在成功使用 Restkit 进行 GET,现在我尝试将其用于 POST 并得到错误。这是我认为非常标准的 RESTKit 代码:

RKObjectMapping *mappingTransaction = [RKObjectMapping mappingForClass:[Transaction class]];
NSDictionary *mappingTransactionDict = @{
                                           @"final_price" : @"finalPrice",
                                           @"discount" : @"discount",
                                           @"customer_fk" : @"customerID",
                                           @"typeofpayment_fk" : @"typeOfPaymentID",
                                           @"shop_fk" : @"shopID",
                                           @"systemuser_fk" : @"systemUserID",
                                           @"company_fk" : @"companyID",
                                           @"created_at" : @"creationDate",
                                           @"updated_at" : @"updateDate"
                                           };
[mappingTransaction addAttributeMappingsFromDictionary:mappingTransactionDict];


RKResponseDescriptor *transactionDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:mappingTransaction
                                             method:RKRequestMethodPOST
                                        pathPattern:@"/revenue/add/transaction"
                                            keyPath:nil
                                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:transactionDescriptor];

[[RKObjectManager sharedManager] postObject:(Transaction *)transactionRecord
                                       path:@"/revenue/add/transaction"
                                       parameters:nil
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult){
                                              //self.typeOfPaymentArray = mappingResult.array;
                                          }
                                          failure:^(RKObjectRequestOperation *operation, NSError *error){
                                              NSLog(@"Transaction insert failed': %@", error);
                                          }];

然后出现“TokenMismatchException”的错误:

我用谷歌搜索了它,但似乎所有线程都在谈论表单中的 CSRF 令牌,在我的例子中是第三方 IOS 应用程序。我的 RESTFul API 由 Laravel 5 运行。任何想法都将不胜感激。感谢您的关注。

【问题讨论】:

  • 你有请求描述符吗?服务器期望什么,它得到什么?

标签: objective-c laravel restkit


【解决方案1】:

在您的情况下,您想在请求中(而不是在响应中)映射一个对象(事务),因此您应该使用以下方法而不是使用 responseDescriptorWithMapping

+ (instancetype)requestDescriptorWithMapping:(RKMapping *)mapping objectClass:(Class)objectClass rootKeyPath:(NSString *)rootKeyPath method:(RKRequestMethod)method

【讨论】:

  • 我也需要 requestMapping 吗?
  • 是的,如果您通过 POST 发送对象,则必须这样做。建议:为避免再次重复映射,我建议您使用实用程序 inverseMapping: requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[mappingTransaction inverseMapping] objectClass:[Transaction class] rootKeyPath:nil method:RKRequestMethodPOST];
  • 可能你忘记添加授权了:[[RKObjectManager sharedManager].HTTPClient setAuthorizationHeaderWithUsername:@"yourusername" password:@"yourpassword"];
  • 显然这可能与 Laravel 5 中的要求有关,即所有 post 请求都需要 csrf 令牌。我正在深入研究文档并了解如何将 csrf 令牌包含到 RESTKit 请求中。参考:stackoverflow.com/questions/29620628/…。我会将任何发现发布到此线程。感谢您付出的所有努力。
  • 终于成功了!我必须在我的 RESTFul 后端(Laravel 5)中禁用 CSRF 令牌检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2011-12-05
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多