1

Ich bin in einer wirklich schlechten Situation.Statuscode ändern Rails

Ich verwende Volley auf einer Android-Anwendung mit Ruby on Rails JSON API.

Problem ist, gibt es einen Fehler mit Volley machen es nicht möglich, irgendetwas mit staus 401 zu identifizieren. Grundsätzlich, wenn es einen 401-Status gibt, ist die NetworkResponse null und VolleyError ist vom Typ NoConnectionError.

Ich habe viel gesucht und der einzige Weg ist es, 403 statt 401 zurückzugeben, die von Volley richtig erkannt werden können.

Wie kann ich die Statuscodes aller Antworten auf 403 ändern, wenn sie 401 in Schienen sind? Ich kann nicht alle Aktionen kontrollieren und 403 zum Beispiel in vorgefertigten Aktionen zurückgeben.

Gibt es eine Möglichkeit, Antworten oder etwas in Schienen zu finalisieren?

+0

Wenn Sie die API-Statuscodes von Rails nicht steuern können, versuchen Sie es mit alternativen Lösungen wie dem Erweitern der Anforderung und dem Überschreiben von parseNetworkResponse wie in http://stackoverflow.com/questions/22948006/http-status-code-in-android-volley- beschrieben. when-error-networkresponse-is-null – random

+0

Ich habe das gemacht, aber wenn die Antwort 401 zurückgibt, ist NetworkResponse gleich null. –

+0

Sie können volley als ein Modul hinzufügen und BasicNetwork.java ändern, um die richtige Antwort zurückzugeben – random

Antwort

0

ich eine Lösung für mein Problem aus der Ruby on Rails Backend-Seite gefunden, die für die gesamte Anwendung verallgemeinert wird, die ist erforderlich, da viele Controller geben würde auch 401 und nicht nur devise.

Ich habe Rack Middleware, indem Sie die folgenden verwendet:

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 

Jetzt ist UnauthorizedToForbidden am unteren Rand des Rack Stapel und wird an der sehr ausgeführt Ende, bevor die Antwort tatsächlich an den Benutzer gesendet wird. Es ändert grundsätzlich den Statuscode, wenn es 401 zu 403 ist.

1

Da Gerät Warden verwendet, können Sie eine benutzerdefinierte Fehleranwendung erstellen und den gewünschten HTTP-Status festlegen.

In 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 

In config/initializers/devise.rb

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

In config/application.rb

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

Ich werde das versuchen, aber wird dies die Fehlerreaktion für alles andere, was in der Entwicklung ist? –

1

401 Statuscode kommen könnte mit einem leeren Antwortdaten und wenn Sie dies überprüfen volley code Linie 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)); 
     } 
    } 

wenn jsonString leer ist es immer noch versucht, eine JSONObject daraus new JSONObject(jsonString) zu schaffen, die eine JSONException wirft

Sie können Volley Quellcode herunterladen, importieren Sie es als Modul in Ihrem Android-Studio-Projekt, fügen Sie es Abhängigkeit und machen diese Korrektur:

@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)); 
     } 
    } 
} 

um Volley zu Ihrem Projekt hinzufügen - die Volley-Repository klonen und als Bibliotheksprojekt gesetzt

  1. Git klonen das Repository durch die folgende in der Befehlszeile eingeben:

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

  2. Importieren Sie die heruntergeladene Quelle in Ihr App-Projekt als Android Bibliotheksmodul wie in Create an Android Library beschrieben.

Sie auch Prase 401 volley error message versuchen können, wenn Sie nicht ein Update innerhalb der importierten Bibliothek wollen: