Retrofit- Android:不接受请求方法

时间:2016-09-07 10:02:18

标签: android retrofit retrofit2 okhttp3 android-webservice

在我的Android应用程序中,我正在尝试使用改造来进行api调用。我想使用改造来执行用户注册。问题是,执行api调用并且调试器也转到onResponse(),但我的api返回响应消息,因为'请求方法不被接受'。我跟邮递员检查过,它运作正常。在邮递员中,我将值传递为表单数据。请帮我解决这个问题。这是我的代码:

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:1.5.1@aar'
    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'
}
请告诉我我哪里出错了。

2 个答案:

答案 0 :(得分: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并验证RegisterPojo格式是否正确。

对我来说,像这样初步化Retrofit很有效:

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

答案 1 :(得分:1)

你必须将接口声明为Call<RegisterPojo> insertUser(@Body UserClass user); 如果您可以通过记录拦截器检查您的请求,您将看到您的请求正文为;

  

用户名:姓名,电子邮件:email@m.com ...

但它应该是;

  

{&#34;用户名&#34;:姓名,&#34;电子邮件&#34;:email@m.com ...}

idk为什么,但我的工作是我的要求(与身体和类)。我相信有一种方法可以让它与田野一起工作,但我找不到。