POST 使用 CURL 请求 Rails 应用
POST request using CURL for Rails App
很多用户都问过这个问题,我已经尝试了所有的解决方案,但没有一个有效for.for 例如:这个问题在这里 curl json post request via terminal to a rails app 但结果仍然相同。
我正在尝试通过运行以下命令使用 CURL 通过终端 POST 数据:
curl -i -H 'Authorization: Token token'="9asdadsasd87t8ddaghsd" -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"request":{"sender_mobile":"12331212","recipient_mobile":"121231231","location":"Bangalore"}}' http://localhost:3000/api/v1/requests
并得到回应:
HTTP/1.1 422 Unprocessable Entity
Content-Type: text/html; charset=utf-8
Content-Length: 15450
X-Request-Id: f1025e69-9ff3-4bd1-9bd5-0679fbcc50bc
X-Runtime: 0.062784
Server: WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)
Date: Thu, 08 Jan 2015 10:35:45 GMT
Connection: Keep-Alive
有这么多行垃圾,但我想这个响应足以理解什么可能是 cause.Here 是 link 完成错误 http://pastebin.com/n342HeYL
我可以使用以下命令成功执行 GET 请求:
curl -i 'http://localhost:3000/api/v1/requests' -H 'Authorization: Token token'="952aa4598ec2cd87c8b69056616a00af"
响应:
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: application/json; charset=utf-8
Etag: "b956523e0345d2bb466d39823195b600"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 91d21235-246f-4557-a67a-92dca02b9cc1
X-Runtime: 0.011781
Server: WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)
Date: Thu, 08 Jan 2015 10:51:55 GMT
Content-Length: 486
Connection: Keep-Alive
所以,我不知道 POST 请求有什么问题。
这是我的request_controller.rb文件
module Api
module V1
class RequestsController < ApplicationController
# skip_before_action :verify_authenticity_token
before_filter :restrict_access
respond_to :json
def index
respond_with Request.all
end
def show
respond_with Request.find(params[:id])
end
def create
respond_with Request.create(params[:request])
end
def update
respond_with Request.update(params[:id], params[:request])
end
def destroy
respond_with Request.destroy(params[:id])
end
private
def restrict_access
authenticate_or_request_with_http_token do |token, options|
ApiKey.exists?(access_token: token)
end
end
end
end
end
关于上面的对话,我写一个答案吧。
如果您在 rails 中看到一个表格,它会有如下所述的一行
<input name="authenticity_token" type="hidden" value="+wFCV3kv0X/WI0qb54BgYlDzi+Tp+6HIGM61a4O6gg0=">
现在,如果在 ApplicationController
中你有这一行 protect_from_forgery
那么它总是期望 authenticity_token
如果它不可用,它会抛出你的日志中提到的错误因此我建议删除该行,因为您不会将 authenticity_token
作为 api POST
请求的参数传递。
您的 get 请求工作正常的原因是 rails 不期望 GET
请求上的 authenticity_token
。
现在,你说你删除了 protect_from_forgery
但你遇到了一个内部服务器错误,这个错误必须由你处理,因为它与 GET
或 [=15= 无关] 请求,但这是您的 rails 应用程序中的错误。所以解决这个错误,它应该可以正常工作。或者 post 错误日志在这里,所以我可以帮助你。
编辑:内部服务器 500 错误的解决方案
随着下面粘贴的日志,您还需要在控制器中允许这些属性,就像代码中提到的@abhinay。
希望对您有所帮助
很多用户都问过这个问题,我已经尝试了所有的解决方案,但没有一个有效for.for 例如:这个问题在这里 curl json post request via terminal to a rails app 但结果仍然相同。
我正在尝试通过运行以下命令使用 CURL 通过终端 POST 数据:
curl -i -H 'Authorization: Token token'="9asdadsasd87t8ddaghsd" -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"request":{"sender_mobile":"12331212","recipient_mobile":"121231231","location":"Bangalore"}}' http://localhost:3000/api/v1/requests
并得到回应:
HTTP/1.1 422 Unprocessable Entity
Content-Type: text/html; charset=utf-8
Content-Length: 15450
X-Request-Id: f1025e69-9ff3-4bd1-9bd5-0679fbcc50bc
X-Runtime: 0.062784
Server: WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)
Date: Thu, 08 Jan 2015 10:35:45 GMT
Connection: Keep-Alive
有这么多行垃圾,但我想这个响应足以理解什么可能是 cause.Here 是 link 完成错误 http://pastebin.com/n342HeYL
我可以使用以下命令成功执行 GET 请求:
curl -i 'http://localhost:3000/api/v1/requests' -H 'Authorization: Token token'="952aa4598ec2cd87c8b69056616a00af"
响应:
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: application/json; charset=utf-8
Etag: "b956523e0345d2bb466d39823195b600"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 91d21235-246f-4557-a67a-92dca02b9cc1
X-Runtime: 0.011781
Server: WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)
Date: Thu, 08 Jan 2015 10:51:55 GMT
Content-Length: 486
Connection: Keep-Alive
所以,我不知道 POST 请求有什么问题。
这是我的request_controller.rb文件
module Api
module V1
class RequestsController < ApplicationController
# skip_before_action :verify_authenticity_token
before_filter :restrict_access
respond_to :json
def index
respond_with Request.all
end
def show
respond_with Request.find(params[:id])
end
def create
respond_with Request.create(params[:request])
end
def update
respond_with Request.update(params[:id], params[:request])
end
def destroy
respond_with Request.destroy(params[:id])
end
private
def restrict_access
authenticate_or_request_with_http_token do |token, options|
ApiKey.exists?(access_token: token)
end
end
end
end
end
关于上面的对话,我写一个答案吧。
如果您在 rails 中看到一个表格,它会有如下所述的一行
<input name="authenticity_token" type="hidden" value="+wFCV3kv0X/WI0qb54BgYlDzi+Tp+6HIGM61a4O6gg0=">
现在,如果在 ApplicationController
中你有这一行 protect_from_forgery
那么它总是期望 authenticity_token
如果它不可用,它会抛出你的日志中提到的错误因此我建议删除该行,因为您不会将 authenticity_token
作为 api POST
请求的参数传递。
您的 get 请求工作正常的原因是 rails 不期望 GET
请求上的 authenticity_token
。
现在,你说你删除了 protect_from_forgery
但你遇到了一个内部服务器错误,这个错误必须由你处理,因为它与 GET
或 [=15= 无关] 请求,但这是您的 rails 应用程序中的错误。所以解决这个错误,它应该可以正常工作。或者 post 错误日志在这里,所以我可以帮助你。
编辑:内部服务器 500 错误的解决方案
随着下面粘贴的日志,您还需要在控制器中允许这些属性,就像代码中提到的@abhinay。
希望对您有所帮助