Rails API - 期望json显示创建的对象。获取没有对象的302状态代码

时间:2015-07-30 17:50:56

标签: ruby-on-rails ruby json rails-api

我有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正在运行,但我希望看到它成功的回复。

3 个答案:

答案 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}