HTTP 状态代码 302

HTTP status code 302

我正在 Ruby 开发我的 Rails 后端,我想 post 数据到此服务器。但是,如果我使用 PAW 执行 Post-请求,我将被重定向。我是 Http 请求的新手。有人可以向我解释功能以及如何使用 http post 请求吗?

我想post关于我服务器的数据集(sqlite3)的信息。

这是一张截图,应该可以解释一切:

这是如何工作的?请解释 :) 谢谢。 问候约翰

这是代码:

所有者控制器:

#app/controllers/owners_controller.rb
class OwnersController < SessionsController
     respond_to :html
     before_action :owner_find, only: [:show, :edit, :update, :destroy]

     def index
        @owners = Owner.all
     end

     def show
     end  

    def update
       @owner = Owner.find(params[:id])

       if @owner.update(owner_params)
          redirect_to @owner
       else
          render 'edit'
       end
    end

    def new
       @owner = Owner.new
    end

    def destroy 
       @owner.destroy
       redirect_to owners_path
    end

    def edit
    end

    def create
        @owner = Owner.new owner_params
        if @owner.save!
           flash[:notice] = 'You signed up successfully'
           flash[:color]= 'valid'
           redirect_to owners_path
        else
           flash[:notice] = 'Form is invalid'
           flash[:color]= 'invalid'
          render 'new'
        end
    end

  private 

  def owner_find 
     @owner = Owner.find(params[:id])
  end  

  def owner_params
     params.require(:owner).permit(:name, :password, :password_confirmation, :token)
  end
end

会话控制器:

class SessionsController < ApplicationController
  before_filter :authenticate_user, :except => [:login, :login_attempt]

  def login
    #goes to Login Form
  end

  def logout
    session[:owner_id] = nil
    redirect_to :action => 'login'
  end

  def login_attempt
    authorized_user = Owner.authenticate_by_name(params[:login_name],params[:login_password])
    if authorized_user
      session[:owner_id] = authorized_user.id
      flash[:notice] = "Wow Welcome again, you logged in as #{authorized_user.name}"
      redirect_to welcome_index_path
    else
      flash[:notice] = 'Invalid Username or Password'
      flash[:color]= 'invalid'
      render 'login'
    end
  end
end

控制台日志:

来自网络请求 (http://192.168.2.144:3000/owners?name=hans&password=hans321&password_confirmation=hans321)

Started GET "/owners?name=hans&password=[FILTERED]&password_confirmation=[FILTERED]" for 192.168.2.144 at 2015-10-01 12:12:18 +0200 Cannot render console from 192.168.2.144! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by OwnersController#index as HTML Parameters: {"name"=>"hans", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"} Owner Load (0.1ms) SELECT "owners".* FROM "owners" WHERE "owners"."id" = ? LIMIT 1 [["id", 2]] Owner Load (0.1ms) SELECT "owners".* FROM "owners" Rendered owners/index.html.erb within layouts/application (1.8ms) Completed 200 OK in 60ms (Views: 58.9ms | ActiveRecord: 0.2ms)

显示 200 正常,但数据库中没有任何反应。

来自 Paw-Request(所以我可以使用 post。顺便说一下,我如何在浏览器请求中使用 post?

Started POST "/owners?name=hans&password=[FILTERED]&password_confirmation=[FILTERED]" for 192.168.2.144 at 2015-10-01 12:12:45 +0200 Cannot render console from 192.168.2.144! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by OwnersController#create as HTML Parameters: {"name"=>"hans", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"} Can't verify CSRF token authenticity Redirected to http://192.168.2.144:3000/ Filter chain halted as :authenticate_user rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.0ms)

好像是CRSF认证失败了..


编辑:

起初: 给里奇派克!这对我帮助很大。谢谢!!我真的很感谢你的努力。

我接近解决方案了。我的问题是:我无法将正确的参数放入 url。 token-auth 被禁用以进行测试。所以没关系。

参数应该是这样的: 参数:{"utf8"=>"✓", "authenticity_token"=>"q9JvFhoSUgfydFTvh18JHbIIdKNDjnOS9m/trVBu9EHPP04xGsO69zPh1BFZBI1Ev1YcnOTiPmaAiPWOSkm5Xg==", "owner"=>{"name"=>"Hubert", "password"=>[已过滤], "password_confirmation"=>[已过滤]"}, "commit"=>"Create Owner"}

与我的要求不同: 参数:{"name"=>"Hubert", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "owner"=>{ }}

HTTP 状态代码

首先,30x 响应意味着 "Resource Moved"

301 响应被许多 SEO 人员用来表示资源的永久迁移。 302不太常见,但意思还是差不多。

每次发送和接收 HTTP 请求时,您都会收到一个状态代码。典型的是 200 响应 -- status success!


您看到的是正在运行的 redirect_to 命令 -

if @owner.save!
   flash[:notice] = ...
   redirect_to owners_path

我以前从未使用过 PAW,但我认为它只是给你服务器的纯响应,在这种情况下是 30x "Resource Moved"代码。

我希望典型的浏览器请求加载重定向的路由并在屏幕上显示它的收益。


服务器

作为对此进行测试的一种方法,您应该在浏览器中尝试相同的交易:

lvh.me:3000/orders

(lvh.me is a domain routed to your own localhost 这有助于 Rails)

中的子域

这将使您能够测试并查看响应会发生什么。您*应该*发现您的数据已保存到数据库中(尽管在您的情况下是 SQLite3)。


语法

最后,您需要确保在代码中使用正确的语法。

具体来说:

#app/controllers/owners_controller.rb
class OwnersController < ApplicationController
   ...
   def create
      @owner = Owner.new owner_params
   end

   private

   def owner_params
      params.require(:owner).permit(:name, :password, :password_confirmation)
   end
end

您还需要查看 bcrypt-ruby 以保护您的密码。


测试

我倾向于使用标准浏览器功能测试我的 Rails 应用程序。

这意味着您可以 运行 Rails Server(在您的控制台中 $ rails s),然后您就可以通过浏览器访问它。

你正在尝试使用这个 PAW 东西,这没问题,但在应用程序的用户交互性方面没有给你太多灵活性(例如,提交真实表格等)...

对于您的情况,我会执行以下操作:

#app/views/orders/new.html.erb
<%= form_for @order do |f| %>
   <%= f.text_field :name %>
   <%= f.password_field :password %>
   <%= f.password_field :password_confirmation %>
   <%= f.submit %>
<% end %>

然后您将访问 lvh.me:3000/orders/new 并提交表格。这将向您展示它是如何响应的!


HTTP

好的,这就是 HTTP 请求的处理...

无论何时向 Web 应用程序发送一段交易数据,都是通过 HTTP 请求进行的。 HTTP 请求只是通过 "Internet".

发送数据的一种方式

对于基于 Rails 的应用程序,这意味着每次您 "do" 应用程序中的某些内容时,您 确实 向您的应用程序发送 HTTP 请求网络服务器。 Rails 解释此请求并发送 响应 。这个回复就是你的问题。

您询问的是接收 302 响应 - 这是 Web 服务器表示您已被重定向的方式。老实说,这是非常基本的东西;您的浏览器可以处理其中的大部分内容。

可以找到很棒的教程here:


好的,那么你的错误如下:

Can't verify CSRF token authenticity

稍后我可以对此进行详细说明,但现在,您可能需要查找此解决方案:WARNING: Can't verify CSRF token authenticity in case of API development