在我的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'
}
请告诉我我哪里出错了。
答案 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为什么,但我的工作是我的要求(与身体和类)。我相信有一种方法可以让它与田野一起工作,但我找不到。