2016-09-07 1 views
0

Dans mon application android, j'essaie d'utiliser retrofit pour faire des appels api. Je veux effectuer l'enregistrement de l'utilisateur en utilisant le rétrofit. Le problème est que l'appel api est exécuté et le débogueur passe également à onResponse(), mais mon API renvoie le message de réponse en tant que "Méthode de requête non acceptée". J'ai vérifié avec le facteur, cela fonctionne correctement. en postier, je passe des valeurs en forme-données. aidez-moi s'il vous plaît à résoudre ce problème. voici mon code:Rénovation- Android: méthode de demande non acceptée

public interface RegisterAPI { 
    @FormUrlEncoded 
    @POST("Register.php") 
    Call<RegisterPojo> insertUser(
      @Field("username") String username, 
      @Field("email") String email, 
      @Field("password") String password, 
      @Field("c_password") String c_password 
    ); 
} 

Activité

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

      RegisterAPI service = retrofit.create(RegisterAPI.class); 


      Call<RegisterPojo> call = service.insertUser(
          edtUname.getText().toString(), edtEmail.getText().toString(), 
          edtPassword.getText().toString(), edtConfirmPassword.getText().toString()); 

    call.enqueue(new Callback<RegisterPojo>() { 
        @Override 
        public void onResponse(Call<RegisterPojo> call, Response<RegisterPojo> response) { 
         if (response.body() != null) { 
//HERE IT SHOWS "Request method not accepted" 
          Log.e("msg", response.body().getMsg()); 
          Toast.makeText(mContext, response.body().getMsg(), Toast.LENGTH_LONG).show(); 
         } 
        } 

        @Override 
        public void onFailure(Call<RegisterPojo> call, Throwable t) { 
         Log.e("msg", "Failed"); 
        } 
       }); 

RegisterPojo

public class RegisterPojo { 

    @SerializedName("status") 
    @Expose 
    private Integer status; 

    @SerializedName("msg") 
    @Expose 
    private String msg; 

    @SerializedName("id") 
    @Expose 
    private String id; 

    @SerializedName("email") 
    @Expose 
    private String email; 

    @SerializedName("username") 
    @Expose 
    private String username; 

    public Integer getStatus() { 
     return status; 
    } 

    public void setStatus(Integer status) { 
     this.status = status; 
    } 

    public String getMsg() { 
     return msg; 
    } 

    public void setMsg(String msg) { 
     this.msg = msg; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.2" 
    defaultConfig { 
     applicationId "app.sample" 
     minSdkVersion 15 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:24.2.0' 
    testCompile 'junit:junit:4.12' 
    compile 'com.github.aakira:expandable-layout:[email protected]' 
    compile 'com.squareup.retrofit2:retrofit:2.1.0' 
    compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
    // compile 'com.squareup.retrofit2:converter-scalars:2.1.0' 
    compile 'com.squareup.okhttp3:okhttp:3.4.1' 
    compile 'com.google.code.gson:gson:2.7' 
} 

s'il vous plaît me dire où je me trompe.

+0

journal dispositif mis ici –

+0

votre api peut accepter la méthode GET uniquement. –

+0

Non, il accepte la méthode POST. J'ai exécuté même api avec la méthode POST dans le facteur. ça fonctionne parfaitement avec ça. – zanky

Répondre

1

En onResponse(), son meilleur pour vérifier l'exécution des requêtes avec succès et le message du corps de l'objet Response.

call.enqueue(new Callback<RegisterPojo>() { 
    @Override 
    public void onResponse(Call<RegisterPojo> call, Response<RegisterPojo> response){ 
     if(response.isSuccess()) 
     { 
      // Now try to get message from the body 
     } 
     else 
     { 
      // Error occurred while execution 
     } 
    } 

    @Override 
    public void onFailure(Call<RegisterPojo> call, Throwable t) { 
     Log.e("msg", "Failed"); 
    } 
}); 

Si isSuccess() est faux, le message d'erreur peut être récupéré comme ceci:

response.errorBody().string() 

Et si la réponse est la réussite, et vous ne pouvez pas obtenir les données alors le problème est avec votre modèle RegisterPojo. La bibliothèque de conversion que vous utilisez ne peut pas convertir JSON en objet. Assurez-vous également que vous implémentez Serializable dans ce modèle.

Cochez cette case link et vérifiez que le format RegisterPojo est correct ou non.

Pour moi, l'initialisation d'amélioration comme cela a fonctionné:

private static Gson gson = new GsonBuilder() 
    .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC) 
    .serializeNulls() 
    .create(); 

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

J'ai vérifié, ça va dans 'response.isSuccess()'. Cela signifie que l'appel api a réussi. – zanky

+0

@zanky Voir ma réponse mise à jour. Assurez-vous également que 'RegisterPojo' est au format correct. –

+0

J'ai ajouté 'RegisterPojo' dans ma question. – zanky

0

vous devez déclarer l'interface comme Call<RegisterPojo> insertUser(@Body UserClass user); si vous pouvez vérifier votre demande, vous verrez de se connecter intercepteur corps de votre requête comme;

Nom d'utilisateur: nom, email: [email protected] ...

mais il doit être aussi;

{ "nom d'utilisateur": nom, "email": [email protected] ...}

idk pourquoi mais je travaille ma demande fis comme cela (avec le corps et la classe). Je suis sûr qu'il y a un moyen de le faire fonctionner avec le champ mais je n'ai pas pu le trouver.