【问题标题】:HTTP status code 302HTTP 状态码 302
【发布时间】:2015-12-29 06:03:23
【问题描述】:

我正在使用 Ruby 开发我的 Rails 后端,我想将数据发布到此服务器。但是,如果我使用 PAW 进行 Post-request,我会被重定向。我是 Http Requests 的新手。有人可以解释一下它的功能以及如何使用 http 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)

在 2015 年 10 月 1 日 12:12:18 +0200 开始 GET "/owners?name=hans&password=[FILTERED]&password_confirmation=[FILTERED]" for 192.168.2.144 无法从 192.168.2.144 渲染控制台!允许的网络:127.0.0.1、::1、127.0.0.0/127.255.255.255 OwnersController#index 作为 HTML 处理 参数:{"name"=>"hans", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"} Owner Load (0.1ms) SELECT "owners".* FROM "owners" WHERE "owners"."id" = ?限制 1 [["id", 2]] Owner Load (0.1ms) SELECT "owners".* FROM "owners" 在布局/应用程序中渲染 owner/index.html.erb (1.8ms) 在 60 毫秒内完成 200 次 OK(查看次数:58.9 毫秒 | ActiveRecord:0.2 毫秒)

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

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

开始 POST "/owners?name=hans&password=[过滤]&password_confirmation=[过滤]" 对于 192.168.2.144 在 2015-10-01 12:12:45 +0200 无法渲染控制台 来自 192.168.2.144!允许的网络:127.0.0.1, ::1, 127.0.0.0/127.255.255.255 由 OwnersController#create 作为 HTML 参数处理:{"name"=>"hans", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"} 无法验证 CSRF 令牌 真实性重定向到http://192.168.2.144:3000/过滤链 停止为 :authenticate_user 呈现或重定向完成 302 1ms 内找到 (ActiveRecord: 0.0ms)

CRSF 认证好像失败了..


编辑:

起初: 致富派克!这对我帮助很大。谢谢!!非常感谢您的努力。

我接近解决方案.. 我的问题是:我无法在 url 中放置正确的参数。禁用令牌身份验证以进行测试。所以没关系。

参数应该是这样的: 参数:{"utf8"=>"✓", "authenticity_token"=>"q9JvFhoSUgfydFTvh18JHbIIdKNDjnOS9m/trVBu9EHPP04xGsO69zPh1BFZBI1Ev1YcnOTiPmaAiPWOSkm5Xg==", "owner"=>{"name"=>"Hubert", "password"=>"[FILTERED] , "password_confirmation"=>"[FILTERED]"}, "commit"=>"创建所有者"}

而不是按照我的要求: 参数:{"name"=>"Hubert", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "owner"=>{}}

【问题讨论】:

  • 下一次,您应该确保将代码放在问题的正文中,而不是图像中:)
  • 我认为只截屏会更容易。我会编辑它。 :)

标签: ruby-on-rails http post http-status-code-302


【解决方案1】:

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 的应用程序,这意味着每次您在应用程序中“做”某事时,您确实向您的网络服务器发送了一个 HTTP 请求。 Rails 解释这个请求并发送一个响应。这个回答就是你的问题。

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

一个很棒的教程可以找到here:


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

无法验证 CSRF 令牌的真实性

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

【讨论】:

  • 谢谢。这解释了很多。我已经在使用 bcrypt 进行密码散列和加盐。 :) 我会尝试一些事情,然后我会给你一些反馈。非常感谢!!
  • 没问题,还有什么需要我解释的告诉我
  • 我必须将新用户的值放在 URL 参数或标题中吗?
  • 如果我在浏览器中进行测试,我只需在new 操作中提交表单,在new 视图中创建表单并不难。如果你需要,我可以把代码写出来。
  • 好的。我无法确切地想象你在告诉我什么。写出代码会很棒。我试图用这个在数据库中保存一个新用户:URL-POST-Request我不知道..这似乎是错误的。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2013-12-11
  • 2013-12-10
相关资源
最近更新 更多