Retrofit 2 запрос входа в систему возвращает 500, но хорошо работает на почтальоне - PullRequest
0 голосов
/ 03 мая 2018

Я реализую метод входа в систему с использованием дооснащения 2. Он хорошо работает в Postman, но возвращает ошибку 500. Я пробовал разные решения, и те, которые искали в StackOverFlow, не работали для меня, поэтому вот моя реализация:

Интерфейс INetworkAPI:

   @FormUrlEncoded
   @POST("mobile/login")
   Call<JsonObject> login(@Field(value = "_username") String username, @Field(value = "_password") String password); 

Интерфейс INetworkAPI:

Логин

 public void login(String _username, String _password, final NetworkRequestObjectResult callBackResult) {


         mRoomPresenceAPI = provideApiService();

    Call<JsonObject> callObject = mRoomPresenceAPI.login(_username, _password);
    callObject.enqueue(new Callback<JsonObject>() {
        @Override
        public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {

          if (response.body() != null && response.code() == 200) {
                Log.i(TAG, "mobile/login Success code: "+response.code() + " content: "+response.body().toString());
                callBackResult.onSuccess(null);

            } else {
                if (response.errorBody() != null) {
                    Log.e(TAG, "mobile/login error code: "+response.code() + " error content: "+response.errorBody().toString());
                    //general error
                    callBackResult.onError(mContext.getResources().getString(R.string.error_login));
                }
            }


        }

        @Override
        public void onFailure(Call<JsonObject> call, Throwable t) {
            Log.e(TAG, "mobile/login error : "+t.getMessage());
            callBackResult.onError(mContext.getResources().getString(R.string.error_login));
        }
    });

}

предоставляем услуги

  public INetworkAPI provideApiService() {
    return provideRetrofit(BASE_URL, provideClient()).create(INetworkAPI.class);
   }

   //provide client
   public OkHttpClient provideClient() {

    loadSSLConfig();

    OkHttpClient.Builder clientBuilder = getUnsafeOkHttpClient();
    clientBuilder.addInterceptor(new ResponseInterceptor());

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    clientBuilder.addInterceptor(loggingInterceptor);


    return clientBuilder.build();
}


class ResponseInterceptor implements Interceptor {
    @Override
    public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
        okhttp3.Response response = chain.proceed(chain.request());
        return response.newBuilder()

    }
}






private void loadSSLConfig() {
    try {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");

        InputStream inputStream = mContext.getApplicationContext().getAssets().open("roompresencecom_cert.crt");

                //new BufferedInputStream(new FileInputStream("roompresencecom_cert.crt"));
               // mContext.getResources().openRawResource(R.raw.roompresencecom_cert);
        Certificate certificate = certificateFactory.generateCertificate(inputStream);
        inputStream.close();

        // Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", certificate);

        // Create a TrustManager that trusts the CAs in our KeyStore.
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(tmfAlgorithm);
        trustManagerFactory.init(keyStore);

        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
        x509TrustManager = (X509TrustManager) trustManagers[0];

        // Create an SSLSocketFactory that uses our TrustManager
        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, new TrustManager[]{x509TrustManager}, null);
        sslSocketFactory = sslContext.getSocketFactory();


    } catch (Exception ex) {
        ex.printStackTrace();
    }


}


public static OkHttpClient.Builder getUnsafeOkHttpClient() {
    try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
        builder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });
        return builder;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

обеспечить модернизацию public Retrofit provideRetrofit (String baseURL, клиент OkHttpClient) {

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setLenient();
    gson = gsonBuilder.create();


    return new Retrofit.Builder()
            .baseUrl(baseURL)
            .client(client)
           .addConverterFactory(ScalarsConverterFactory.create())
           .addConverterFactory(GsonConverterFactory.create(gson))
            .build();
}

базовый URL public final String BASE_URL = "https://sandbox.roompresence.com/";

       [Postman][1]

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Проблема решена (проблема с сервером). Одно конкретное примечание: в API этот запрос был внутренним перенаправлением на запрос входа в сеть, это перенаправление выполнялось хорошо из POstman и IOS, но не из Android (мои коллеги, которые разработали веб-версию, обнаружили это с помощью Fiddler). Этот запрос также не принадлежал используемому мною мобильному API, поэтому проблема может быть в этом.

Решением было добавить новый запрос на вход в мобильный API и вуаля, это сработало.

Запрос на модернизацию:

 @POST("mobile/login")
 Call<JsonObject> login(@Body Map<String,String> parameters);
0 голосов
/ 03 мая 2018

попробуйте, надеюсь, это поможет вам!

Call<JsonObject> login(@Field("_username") String username, @Field("_password") String password);
...