抓取:为什么我的内容类型会发生变化?

时间:2016-03-22 10:19:30

标签: ruby-on-rails reactjs fetch react-redux

这是一个两个问题。我在Rails中非常稳固,但在react / redux上却是一个菜鸟,而且我正在努力在react / redux应用程序上实现身份验证。

我有一个我已经构建的Rails 4 API。它经过了良好的测试和稳固。我的Rails API使用了devise-token-auth gem。

fetch('http://localhost:8080/api/auth/sign_in', {
  method: 'POST',
  headers: {'Content-Type': 'application/json', 'Accept': "application/vnd.myproject.v1"},
  body: {email: email, password: password},
  ... // snip response handling
})

然而,当它发送请求时,我的API返回401 Unauthorized,请求失败。

签出服务器日志后,我发送请求的正文无法显示。

params: {"format"=>"json", "controller"=>"devise_token_auth/sessions", "action"=>"create"}

在我的浏览器的网络视图中查看请求,我看到sign_in请求,其中包含以下内容:

accept:application/vnd.myproject.v1
content-type:text/plain;charset=UTF-8

我看到内容类型现在是text/plain。 (有趣的是,#34;接受"是小写的......我也很想知道。)

有人可以向我解释发生了什么吗?

1 个答案:

答案 0 :(得分:0)

您需要发送X-CSRF-TOKEN以及您的帖子请求,或者您应该跳过verify_authenticity_token

如果您想跳过authenticity_token验证,可以使用以下内容:

class ApplicationController < ActionController::Base
  protect_from_forgery
  skip_before_action :verify_authenticity_token, if: :json_request?

  protected

  def json_request?
    request.format.json?
  end
end

如果要设置标头,请参阅示例jQuery Ajax请求:

              $.ajax({
                        type: 'POST',
                        dataType: 'script',
                        beforeSend: function (xhr) {
                            xhr.setRequestHeader('X-CSRF-Token',
                                $('meta[name="csrf-token"]').attr('content'));
                        }, url: $(ui.item).closest('.sortable').data("sortable-link"),
                        success: function (data) {
                            ....
                        }
                    });