HTTP状态码302

6
我正在使用Ruby的Rails后端,想要向该服务器发送数据。但是,如果我使用PAW进行Post请求,会被重定向。我对Http请求是新手,有人能解释一下其功能以及如何使用Http post请求吗?
我想要在我的服务器数据库(sqlite3)上发布信息。
这里有个截图,应该能解释一切: i hope thats all information you need 这是如何工作的?请解释一下 :) 谢谢。 问候,John
以下是代码:
OwnersController:
#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

控制台日志:

来自 web-request (http://192.168.2.144:3000/owners?name=hans&password=hans321&password_confirmation=hans321)

开始GET请求"/owners?name=hans&password=[FILTERED]&password_confirmation=[FILTERED]",来自192.168.2.144的请求时间为2015-10-01 12:12:18 +0200 无法从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" =?LIMIT 1 [["id", 2]] Owner Load (0.1ms) SELECT "owners".* FROM "owners" 在layouts/application中呈现了所有者/index.html.erb(1.8ms) 完成200 OK,用时60ms(视图:58.9ms | ActiveRecord:0.2ms)
它显示200 ok,但在数据库中没有发生任何事情。
来自Paw-Request(所以我可以使用post。顺便问一下,在浏览器请求中如何使用post?
开始POST请求 "/owners?name=hans&password=[FILTERED]&password_confirmation=[FILTERED]",来自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/。过滤器链因身份验证用户呈现或重定向而停止。在1毫秒内完成302发现(ActiveRecord: 0.0ms)。看起来CSRF认证失败了...

编辑:

首先,感谢Rich Peck!这对我帮助很大。谢谢!我非常感激你的努力。

我接近解决方案了...我的问题是:我无法在URL中放置正确的参数。令牌身份验证已被禁用进行测试,因此不会有影响。

参数应该像这样: Parameters: {"utf8"=>"✓", "authenticity_token"=>"q9JvFhoSUgfydFTvh18JHbIIdKNDjnOS9m/trVBu9EHPP04xGsO69zPh1BFZBI1Ev1YcnOTiPmaAiPWOSkm5Xg==", "owner"=>{"name"=>"Hubert", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create Owner"}

而不是我的请求中这样: Parameters: {"name"=>"Hubert", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "owner"=>{}}


下次,你应该确保将你的代码放在问题的正文中,而不是图片中 :) - Richard Peck
我以为只需要截个屏就行了,我会编辑的 :) - Coding John
1个回答

11

HTTP状态码

首先,30x响应意味着"资源已移动"

301响应被许多SEO人员用来表示资源的永久重定向。而302则不太常见,但仍然表示类似的含义。

每次发送和接收HTTP请求时,您都会收到一个状态码。典型的是200响应——状态成功


您所看到的是redirect_to命令在执行 -

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

我之前没有使用过PAW,但我认为它只是提供服务器的纯响应, 在这种情况下会返回一个30x "资源已移动" 代码。

我期望浏览器请求会加载重定向的路由并在屏幕上显示其产生的结果。


服务器

为了测试这个问题,你应该尝试在浏览器中进行相同的交互:

lvh.me:3000/orders

(lvh.me是一个指向本地主机的域名,有助于在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请求的问题在这里...

enter image description here

每当您将交易数据发送到您的Web应用程序时,您都会通过HTTP请求来完成。HTTP请求只是通过“互联网”发送数据的一种方式。

对于基于Rails的应用程序,这意味着每次您在应用程序中“执行”操作时,实际上您正在向Web服务器发送一个HTTP请求。 Rails解释此请求并发送响应。 这个响应就是你的问题所涉及到的。

您正在询问接收到的302响应 - 这是Web服务器表示您已被重定向的方式。 老实说,这是相当基本的东西。 您的浏览器处理大部分内容。

一个很棒的教程可以在这里找到:

enter image description here


那么,您的错误如下:

无法验证CSRF令牌的真实性

我稍后可以更详细地说明这一点,但现在,您可能需要查找此解决方案


1
没问题,如果你需要我解释其他的东西,请告诉我。 - Richard Peck
我需要将新用户的值放在URL参数还是标头中? - Coding John
因为我在我的SQLite Studio中查找了它。 - Coding John
如果您愿意,我可以撰写有关HTTP请求的更新,但是如果您发布请求的控制台日志,这将更有帮助-这将向我们展示它是否保存了我们需要的数据。 - Richard Peck
我编辑了问题中的控制台日志。 - Coding John
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接