2016-09-07 11 views
0

私のAndroidアプリケーションでは、私は改造を使ってAPIコールを作成しようとしています。私は改造を使用してユーザー登録を実行したい。問題は、api呼び出しが実行され、デバッガもonResponse()になりますが、私のAPIは応答メッセージを 'Request method not accepted'として返します。私は郵便配達員とチェックしたが、それは適切に機能する。郵便配達員では、フォームデータとして値を渡しています。この問題を解決するために私を助けてください。ここに私のコードは次のとおりです。Retrofit-アンドロイド:リクエストメソッドが受け入れられません

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

活動

 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' 
} 

私が間違っているつもりですどこを教えてください。

+0

ここにデバイスログを入力してください –

+0

あなたのAPIはGETメソッドのみを受け入れるかもしれません。 –

+0

いいえ、POSTメソッドを受け入れます。私は郵便配達員のPOSTメソッドで同じapiを実行しました。それは完全に動作します。 – zanky

答えて

1

onResponse()では、成功したクエリの実行を確認し、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"); 
    } 
}); 

isSuccess()がfalseの場合、エラーメッセージは次のように取り出すことができます。

response.errorBody().string() 

そして、応答が成功で、あなたがデータを得ることができないならば、問題はあなたのRegisterPojoモデルです。使用している変換ライブラリはJSONをオブジェクトに変換できません。このモデルでSerializableを実装していることを確認してください。

これをチェックして、の形式が正しいかどうかを確認してください。linkこのようにレトロフィットを初期化する私にとっては

は、働いていた:

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

私は 'response.isSuccess()'の中に入っていることを確認しました。つまり、api呼び出しが成功したことを意味します。 – zanky

+0

@zanky私の更新された回答を参照してください。また、 'RegisterPojo'が正しい形式であることを確認してください。 –

+0

私の質問に 'RegisterPojo'を追加しました。 – zanky

0

は、あなたがあなたがあなたのリクエストボディをとして表示されますインターセプタをログからのリクエストを確認することができた場合Call<RegisterPojo> insertUser(@Body UserClass user); としてインターフェイスを宣言する必要があり、

ユーザ名:名前、電子メール:[email protected] ...

が、それはようでなければなりません。

{ "ユーザー名":名前、 "電子メール":[email protected] ...}

はなぜIDKのが、私は(体とクラスで)このように私の要求を働かせました。私はそれがフィールドで動作するようにする方法があると確信していますが、私は見つけられませんでした。

関連する問題