我有2个应用。一个普通的Ruby应用程序和一个 Rails应用程序,它从普通的Ruby应用程序中侦听POSTS,并显示已发布的数据。
我正在尝试为我的Rails应用设计基本API。我使用法拉第来POST
一些JSON
到我的应用。该部分正在工作我可以看到在POST
之后创建了对象。
在我的resp
中,我期待看到与我刚刚创建的对象相关的内容。相反,我确实看到status=302
。
如何获得显示success
的回复,也许某些json与创建的对象会很好。我真的想要一个POST
正确的指标。
---来自普通Ruby应用的代码,该代码发送到我的 Rails应用
conn = Faraday.new(:url => 'http://localhost:3000/api/v1/tests') do |faraday|
faraday.request :url_encoded # form-encode POST params
faraday.response :logger # log requests to STDOUT
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
end
resp = conn.post do |req|
req.headers['Content-Type'] = 'application/json'
req.body = data.to_json
end
当我在pry中检查resp
时,我得到了这个
[1] pry(#<Object>)> resp
=> #<Faraday::Response:0x007fb8c3a317d0
@env=
#<struct Faraday::Env
method=:post,
body="<html><body>You are being <a href=\"http://localhost:3000/tests/2\">redirected</a>.</body></html>",
url=#<URI::HTTP:0x007fb8c34176b0 URL:http://localhost:3000/api/v1/tests>,
request=
#<struct Faraday::RequestOptions
params_encoder=nil,
proxy=nil,
bind=nil,
timeout=nil,
open_timeout=nil,
boundary=nil,
oauth=nil>,
request_headers={"User-Agent"=>"Faraday v0.9.1", "Content-Type"=>"application/json"},
ssl=
#<struct Faraday::SSLOptions
verify=nil,
ca_file=nil,
ca_path=nil,
verify_mode=nil,
cert_store=nil,
client_cert=nil,
client_key=nil,
certificate=nil,
private_key=nil,
verify_depth=nil,
version=nil>,
parallel_manager=nil,
params=nil,
response=nil,
response_headers=
{"x-frame-options"=>"SAMEORIGIN",
"x-xss-protection"=>"1; mode=block",
"x-content-type-options"=>"nosniff",
"location"=>"http://localhost:3000/tests/2",
"content-type"=>"text/html; charset=utf-8",
"cache-control"=>"no-cache",
"x-request-id"=>"62da5fdc-6f00-4f2a-9c93-c80f6e08c4f8",
"x-runtime"=>"0.219049",
"server"=>"WEBrick/1.3.1 (Ruby/2.2.0/2014-12-25)",
"date"=>"Thu, 30 Jul 2015 16:54:07 GMT",
"content-length"=>"95",
"connection"=>"close",
"set-cookie"=>
"request_method=POST; path=/, _cimportal_session=QjdTN0lOaXBMSTZYT0hvOCsyOVozeW43VTRiSHZXTTBlakJFMmllTTNmdTYvbnd5QllWZnRnSDJhN2lHSDJxM3phSHZWU1VGcElSWEY0V0N3dXd6RHdzTW5leHFtY3hoNDNaTHRCZ2l3ODVaZTVIcXc0eDBnMHdKelhhN2lZeEdIYXNlWU9ZaThETkUvYnRTL293c0lKRGU1N3FrY2liN2t6anBCNlJMaXJFPS0tZmhIQmN0VXVvVEJ4VE5rQ3JLdWphZz09--965190ef9f588d95347f2ee25044eb79f3b5d289; path=/; HttpOnly"},
status=302>,
@on_complete_callbacks=[]>
如您所见,底部有一个状态= 302。我怎样才能在这里得到一个success
以及一些代表该对象的json?
以下是Rails create
方法
@test = Test.new(test_params)
respond_to do |format|
if @test.save
format.html { redirect_to @test, notice: 'Test was successfully created.' }
format.json { render :show, status: :created, location: @test }
else
format.html { render :new }
format.json { render json: @test.errors, status: :unprocessable_entity }
end
我错过了什么? POST
正在运行,但我希望看到它成功的回复。
答案 0 :(得分:2)
你有一句话说:
format.json { render :show, status: :created, location: @test }
这导致了你所看到的302。
而是尝试像
这样的东西format.json { render status: :created, json: @test }
这应返回201状态代码,并使用创建的新对象的JSON进行响应。
答案 1 :(得分:2)
尝试添加&#34; .json&#34;对于URL,控制器不会认为该请求是常规的HTML请求。
如果这样可以解决问题,那么您可以将其添加到所有网址中,或者将控制器配置为respond_to :json
(并从控制器中删除format.html
行。)< / p>
我通常在应用程序控制器中执行此操作,因此所有控制器方法都将继承它:
class ApplicationController < ActionController::Base
respond_to :json
end
你也可以在你的路线中做一些事情来进一步锁定它,但我的记忆对此有点模糊:
resources :users, defaults: { format: :json }
修改强>
上面我建议删除format.html
行,但实际上你可以删除所有格式的东西,只是让方法返回一些JSON而不关心格式是什么:
if @test.save
# assuming there is a jBuilder view for this and that you have the
# respond_to :json in the controller or application controller
render :show, status: :created, location: @test
else
render json: @test.errors, status: :unprocessable_entity
答案 2 :(得分:0)
我用两个答案来帮忙。主要是我将.json添加到URL的末尾,它几乎开始工作。我也改为>>> for key,v in d.iteritems():
try:
nums = [i for i in v if i != '-']
avgd[key] = sum(nums) / len(nums)
except ZeroDivisionError:
avgd[key] = '-'
>>> avgd
{'a': 3.2, 'c': '-', 'b': 5.75, 'd': 8.25}