簡體   English   中英

更改狀態碼Rails

[英]Change status code Rails

我的處境非常糟糕。

我在具有Ruby on Rails JSON API的Android應用程序上使用Volley。

問題是Volley存在一個錯誤,使得它無法正確識別帶有狀態401的任何東西。基本上,只要狀態為401,NetworkResponse就會為null,而VolleyError的類型為NoConnectionError。

我已經搜索了很多,唯一的解決方法是返回403而不是401,而Volley可以正確地識別它。

如果所有響應都在401導軌中為401,如何更改所有響應的狀態碼? 我無法控制所有動作,例如在設計預制動作中返回403。

有沒有一種方法可以最終確定響應或相關內容?

由於devise正在使用Warden,因此您可以創建自定義的failapp並設置所需的http狀態。

在lib / custom_failure.rb中

class CustomFailure < Devise::FailureApp
  def respond
    self.status = 403 
    self.content_type = 'json'
    self.response_body = { error: "Invalid Email or password."}.to_json
  end 
end

在config / initializers / devise.rb中

config.warden do |manager|
  manager.failure_app = CustomFailure
end 

在config / application.rb中

config.autoload_paths << Rails.root.join('lib')

401狀態碼可能帶有空白的響應數據,如果您檢查此齊射代碼行63-75,

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

如果jsonString為空,它仍然嘗試從它創建一個JSONObject, new JSONObject(jsonString)拋出JSONException

您可以下載凌空源代碼,將其作為模塊導入到您的android studio項目中,添加其依賴項並進行更正:

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
//          Fix for an error on blank success response
//          return Response.success(new JSONObject(jsonString),
//                    HttpHeaderParser.parseCacheHeaders(response));
            if (!jsonString.trim().contentEquals("")) {
                return Response.success(new JSONObject(jsonString),
                        HttpHeaderParser.parseCacheHeaders(response));
            }
            else {
                return Response.success(new JSONObject(),
                        HttpHeaderParser.parseCacheHeaders(response));
            }
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
}

要將Volley添加到您的項目中-克隆Volley存儲庫並將其設置為庫項目

  1. 通過在命令行中鍵入以下命令,Git克隆存儲庫:

    git clone https://android.googlesource.com/platform/frameworks/volley

  2. 創建 Android庫中所述,將下載的源作為Android庫模塊導入到您的應用程序項目中。

如果您不想在導入的庫中進行修復,也可以嘗試Prase 401 volley錯誤消息

我從Ruby on Rails后端方面找到了解決我問題的方法,該方法對於整個應用程序是通用的,這是必需的,因為許多控制器也將給出401 ,而不僅僅是devise

我已經通過執行以下操作使用了Rack中間件:

app/middleware/unauthorized_to_forbidden.rb

class   UnauthorizedToForbidden
    def initialize(app)
        @app = app 
    end

    def call(env)
        status, headers, response = @app.call(env)
        if(status == 401)
            status = 403
        end
        [status, headers, response]
    end
end

config/application.rb

class Application < Rails::Application
    config.middleware.use "UnauthorizedToForbidden"
end

現在, UnauthorizedToForbidden位於Rack堆棧的底部,並在將響應實際發送給用戶之前在最后執行。 如果它是401403 ,則基本上會更改狀態碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM