1

Я в очень плохом состоянии.Код с кодом состояния Rails

Я использую Volley для Android-приложения с API-интерфейсом Ruby on Rails JSON.

Проблема заключается в ошибке с Volley, что делает невозможным правильное определение чего-либо с staus 401. В принципе, всякий раз, когда есть статус 401, NetworkResponse имеет значение NULL и VolleyError имеет тип NoConnectionError.

Я много искал, и единственный путь вокруг него - вернуть 403 вместо 401, которые можно правильно идентифицировать волейболом.

Как я могу изменить коды состояния для всех ответов на 403, если они 401 в рельсах? Я не могу контролировать все действия и возвращать 403, например, при разработке готовых действий.

Есть ли способ завершить ответы или что-то в рельсах?

+0

Если вы не можете управлять кодами статуса API-рельсов, попробуйте альтернативные решения, например, продлить запрос и переопределить parseNetworkResponse, как описано в http://stackoverflow.com/questions/22948006/http-status-code-in-android-volley- when-error-networkresponse-is-null – random

+0

Я сделал это, но когда ответ возвращает 401, NetworkResponse имеет значение NULL. –

+0

Вы можете добавить volley в качестве модуля и изменить BasicNetwork.java, чтобы вернуть правильный ответ – random

ответ

0

Я нашел решение моей проблемы со стороны 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.

1

Поскольку 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 

В конфигурации/Инициализаторы/devise.rb

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

В конфигурации/application.rb

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

Я постараюсь, но это станет отказом для всего, что находится внутри устройства? –

1

401 код статуса может прийти с пустым ответом, и если вы проверите эту строку volley code 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

Вы можете скачать залп исходного код, импортировать его в качестве модуля в андроид студии проекта, добавьте его зависимость и сделать эта поправка:

@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 библиотеки, как описано в Create an Android Library.

Вы также можете попробовать Prase 401 volley error message, если вы не хотите, чтобы исправить внутри импортированной библиотеки:

Смежные вопросы