从iOS客户端到Rails应用程序的补丁返回状态422

从iOS客户端到Rails应用程序的补丁返回状态422,ios,ruby-on-rails,http,afnetworking,http-status-codes,Ios,Ruby On Rails,Http,Afnetworking,Http Status Codes,我有一个Rails应用程序,它有一个业务模型对象,有访问次数。我有一个iOS客户端,它使用AFNetworking 2.0与Rails应用程序交互,当用户点击应用程序中的某个业务时,它会向Rails应用程序发送一个补丁,增加该业务的访问量。但是,我从服务器返回一个状态代码422“Unprocessable Entity”错误,并且服务器上业务的访问数没有增加 AFHTTPSessionManager-iOS } 业务控制器-Rails 如果web API允许增加模型对象的计数器,那么它应该有一个

我有一个Rails应用程序,它有一个
业务
模型对象,有
访问次数
。我有一个iOS客户端,它使用AFNetworking 2.0与Rails应用程序交互,当用户点击应用程序中的某个业务时,它会向Rails应用程序发送一个补丁,增加该业务的访问量。但是,我从服务器返回一个状态代码422“Unprocessable Entity”错误,并且服务器上业务的
访问数没有增加

AFHTTPSessionManager-iOS }

业务控制器-Rails 如果web API允许增加模型对象的计数器,那么它应该有一个专用的“方法”

通常,如果客户机本身对其以前从服务器收到的本地副本上执行的计数器进行递增,然后通过编写补丁请求尝试更新服务器的值,其中客户机只发送值
local\u Counter+1
,则递增计数器功能将无法可靠工作。同时,其他客户端也可能有同样的想法,在这种情况下,服务器上的计数器值将被破坏。此外,还可以将服务器上的计数器更新为任何值—这当然不是所需的

其结果是,对于客户端,计数器变量必须是只读的

客户机必须有其他方法(由web API定义)来实现这一点。例如,RESTAPI将定义客户机可以创建的特定“资源”(例如某种“票证”或“预订”)。创建此资源将使服务器上的计数器变量递增

编辑

如果您正在测试web API,那么命令行工具
curl
非常有用:

测试修补程序请求:

在Terminal.app中输入以下命令:

curl -sSv -X PATCH \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"email”:”jappleseed@mail.com"}' \
    http://localhost:3000/api/v1/users/123 \
    | python -m json.tool

在上找到了此问题的正确解决方案。代码如下:

class ApplicationController < ActionController::Base
  protect_from_forgery
  skip_before_action :verify_authenticity_token, if: :json_request?

  protected

  def json_request?
    request.format.json?
  end
end
class ApplicationController
谢谢,这绝对有帮助;我对客户机-服务器设计相当陌生。虽然我肯定会改变我的方法,你能解释一下为什么补丁会返回422吗?它为什么不工作仍然没有意义。@sethfri我不知道它为什么发送422。如果web服务是由您实现的,您应该知道原因;)422(不可处理实体)不是HTTP 1.1状态代码,而是由WebDAV(RFC 4918)定义的。我怀疑Rails核心是否会发出这种代码。它就在Rails生成的控制器代码中-:unprocessable_entity。我只是不明白为什么会有人送去。我的补丁参数似乎是正确的,对吗(如果补丁在这种情况下是正确的方法)?@sethfri
:unprocessable_entity
确实映射到状态代码422。也就是说,您的
更新
方法失败,原因未知(对我而言)。您可以检查数据模型。CouchDeveloper:422是HTTP/1.1状态代码;RFC2616中没有定义它。
curl -sSv -X PATCH \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"email”:”jappleseed@mail.com"}' \
    http://localhost:3000/api/v1/users/123 \
    | python -m json.tool
class ApplicationController < ActionController::Base
  protect_from_forgery
  skip_before_action :verify_authenticity_token, if: :json_request?

  protected

  def json_request?
    request.format.json?
  end
end