使用RestKit iOS 5在rails上发布时出现错误404

时间:2012-01-11 16:39:42

标签: ruby-on-rails ios post request xcode4.2

我在Restkit + iOS 5 + Rails上遇到了一个奇怪的问题:当我尝试在服务器上做这样的帖子时:

NSArray *topicsList=[self.topicsTV.text componentsSeparatedByString:@","]; 
RKParams *params = [NSDictionary dictionaryWithObjectsAndKeys: self.questionTV.text,@"question[text]", 
                                                               self.descriptionTV.text,@"question[detail]",                       
                                                                topicsList,@"topics[]", nil
                    ];
[[RKClient sharedClient] post:@"/questions.json" params:params delegate:self];

日志将如下:

2012-01-11 17:24:21.725 APP[29087:fb03] I restkit.network:RKRequest.m:562 Status Code: 401
2012-01-11 17:24:21.725 APP[29087:fb03] I restkit.network:RKRequest.m:563 Body: {"error":"You have to register or login."}

请注意,在发布之前,我以100%的速度登录,因为我可以访问某些私有内容,而且如果我刷新私有内容(发送到服务器),它会给我这个错误:

2012-01-11 17:35:51.337 APP[29087:fb03] D restkit.network.queue:RKRequestQueue.m:455 Request <RKObjectLoader: 0x811c360> failed loading in queue <RKRequestQueue: 0xc60ea10 name=(null) suspended=NO requestCount=0 loadingCount=0/5> with error: The operation couldn’t be completed. (org.restkit.RestKit.ErrorDomain error 1004.).(Now loading 0 of 5).

该操作是否记录了我?我应该如何保持登录会话的活动?

1 个答案:

答案 0 :(得分:0)

当应用运行POST请求时,rails app无法验证CSRF令牌,可能会发生什么。当您运行GET请求时,它不需要检查令牌(因为GET请求不会更改任何内容)。这就是为什么你可以使用用户名和密码获取内容,但不能发布一些东西。这个blog post有更多信息。

我发现帮助的是我禁用了对任何JSON请求的检查。

# In your application_controller.rb
skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| 
  c.request.format == 'application/json' }

当然,您也可以这样做:

# Or this in your application_controller.rb
def verified_request?
  if request.content_type == "application/json"
    true
  else
    super()
  end
end

其中任何一个都允许JSON请求忽略该令牌,并且您可以适当地进行CRUD。如果你选择忽略支票,就知道你在做什么。

另外:https://github.com/rails/rails/issues/3041