![](/img/trans.png)
[英]How to change activity while get 401 status code in Interceptor Android
[英]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存儲庫並將其設置為庫項目
通過在命令行中鍵入以下命令,Git克隆存儲庫:
git clone https://android.googlesource.com/platform/frameworks/volley
如創建 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
堆棧的底部,並在將響應實際發送給用戶之前在最后執行。 如果它是401
到403
,則基本上會更改狀態碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.