2017-04-06 3 views
1

Ich möchte Retrofit-Bibliothek für Post und Get-Methoden vom Server verwenden. Bei Verwendung proGuard und generieren APK nicht meine Postleitzahl!
Meine Register Codes:Warum nicht arbeiten POST-Methode in Retrofit in Android

@Override 
    public void onClick(View view) { 
     switch (view.getId()) { 
      case R.id.register_button: 
       name = registerName.getText().toString(); 
       email = registerEmail.getText().toString(); 
       password = registerPassword.getText().toString(); 
       if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) { 
        if (password.length() < 6) { 
         Snackbar.make(getView(), "", Snackbar.LENGTH_LONG).show(); 
        } else { 
         registerLoad.setVisibility(View.VISIBLE); 
         registerSend.setVisibility(View.INVISIBLE); 
         registerProcess(name, email, password); 
        } 
       } else { 
        Snackbar.make(getView(), "Fill all fields", Snackbar.LENGTH_LONG).show(); 
       } 
       break; 
     } 
    } 

    private void registerProcess(String name, String email, String password) { 

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

     OkHttpClient client = new OkHttpClient(); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .client(client) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .build(); 

     Retrofit_ApiInterface requestInterface = retrofit.create(Retrofit_ApiInterface.class); 

     User user = new User(); 
     user.setName(name); 
     user.setEmail(email); 
     user.setPassword(password); 

     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.REGISTER_OPERATION); 
     request.setUser(user); 

     Call<ServerResponse> response = requestInterface.operation(request); 
     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) { 
       try { 
        ServerResponse resp = response.body(); 
        if (resp.getResult() != null && resp.getResult().equals("success")) { 
         Snackbar.make(getView(), StringEscapeUtils.unescapeHtml4(resp.getMessage()), Snackbar.LENGTH_LONG).show(); 
         goToLogin(); 
         registerLoad.setVisibility(View.INVISIBLE); 
         registerSend.setVisibility(View.INVISIBLE); 
        } else { 
         registerSend.setVisibility(View.VISIBLE); 
         Snackbar.make(getView(), StringEscapeUtils.unescapeHtml4(resp.getMessage()), Snackbar.LENGTH_LONG).show(); 
        } 
       } catch (Exception e) { 
        Log.e("registerException", "" + e); 
       } 
      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 
       registerLoad.setVisibility(View.INVISIBLE); 
       registerSend.setVisibility(View.VISIBLE); 
       Snackbar.make(getView(), "Try again", Snackbar.LENGTH_LONG).show(); 
      } 
     }); 
    } 

    private void goToLogin() { 

     Fragment login = new LoginFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.loginFragment, login); 
     ft.commit(); 
     toolbarTitle.setText("login"); 
     registerFAB.setImageDrawable(getResources().getDrawable(R.drawable.ic_login_add)); 
    } 
} 

Mein proguard ruls:

-dontwarn retrofit2.** 
-keep class retrofit2.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 

Bei Verwendung GET Methoden zeigen uns nicht Fehler, aber wenn ich Verwendung POST Methode zeigt Fehler!
In meinem Code, wenn Register "Erfolg" oder "Fehler" sollte Nachricht vom Server und in Snackbar zeigen. aber wenn APK mit proguard generieren, zeige mir keine Nachricht in Snackbar!

Ich habe unten Codes in Proguard-Regeln hinzugefügt, um meine Modelle und Schnittstelle nicht zu verschleiern, aber jetzt arbeite mich wieder und zeige keine Nachricht vom Server.

-dontwarn com.test.app.Retrofit.Rest.** 
-dontwarn com.test.app.Retrofit.Model.User.** 

Wie kann ich dieses Problem beheben? Bitte helfen Sie mir, ich brauche wirklich diese Hilfe

Antwort

2
##---------------Begin: proguard configuration for Gson ---------- 
# Gson uses generic type information stored in a class file when working with fields. Proguard 
# removes such information by default, so configure it to keep all of it. 
-keepattributes Signature 

# For using GSON @Expose annotation 
-keepattributes *Annotation* 

# Gson specific classes 
-keep class sun.misc.Unsafe { *; } 
#-keep class com.google.gson.stream.** { *; } 

# Application classes that will be serialized/deserialized over Gson 
-keep class your.package.Models.** { *; } 

# Prevent proguard from stripping interface information from TypeAdapterFactory, 
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) 
-keep class * implements com.google.gson.TypeAdapterFactory 
-keep class * implements com.google.gson.JsonSerializer 
-keep class * implements com.google.gson.JsonDeserializer 


##---------------End: proguard configuration for Gson ---------- 

    # Platform calls Class.forName on types which do not exist on Android to determine platform. 
    -dontnote retrofit2.Platform 
    # Platform used when running on Java 8 VMs. Will not be used at runtime. 
    -dontwarn retrofit2.Platform$Java8 
    # Retain generic type information for use by reflection by converters and adapters. 
    -keepattributes Signature 
    # Retain declared checked exceptions for use by a Proxy instance. 
    -keepattributes Exceptions 

Verwendung die oben genannten Regeln für die Nachrüstung zur Arbeit mit progaurd Hinweis: Sie sollen auch hier -keep Klasse your.package.Models Ihre Modellklassen halten. {*; } haben geeigneten Namen