[英]Put method of Retrofit is not working in Android
I'm trying to implement a put method using Retrofit2 to update records of a demo API, but it's not giving me response in callback and jump into onFailure function.我正在尝试使用 Retrofit2 实现一个 put 方法来更新演示 API 的记录,但它没有在回调中给我响应并跳转到 onFailure 函数。
UpdateResponse class code is below UpdateResponse 类代码如下
public class UpdateResponse {
@SerializedName("id")
@Expose
private int id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("salary")
@Expose
private String salary;
@SerializedName("age")
@Expose
private String age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String employeeName) {
this.name = employeeName;
}
public String getSalary() {
return salary;
}
public void setSalary(String employeeSalary) {
this.salary = employeeSalary;
}
public String getAge() {
return age;
}
public void setAge(String employeeAge) {
this.age = employeeAge;
}
}
Api Interface code is below Api接口代码如下
public interface ApiInterface {
@FormUrlEncoded
@PUT("api/v1/update/{id}")
Call<UpdateResponse> updateUser(@Path("id") int id,
@Field("name") String name,
@Field("salary") String salary,
@Field("age") String age);
}
Api Class code is below Api类代码如下
public class Api {
private static Retrofit retrofit = null;
public static ApiInterface getClient() {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl("http://dummy.restapiexample.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
ApiInterface api = retrofit.create(ApiInterface.class);
return api;
}
}
And Dialog box as main activity code is below对话框作为主要活动代码如下
String nameStr = name.getText().toString();
String salaryStr = salary.getText().toString();
String ageStr = age.getText().toString();
//idd is getting from mainActivity onitemSelect method, which is having the right id value
Call<UpdateResponse> call= Api.getClient().updateUser(idd,nameStr,salaryStr,ageStr);
call.enqueue(new Callback<UpdateResponse>() {
@Override
public void onResponse(Call<UpdateResponse> call, Response<UpdateResponse> response) {
Toast.makeText(c.getApplicationContext(),"Updated Name: "+response.body().getName(),Toast.LENGTH_LONG).show();
dismiss();
}
@Override
public void onFailure(Call<UpdateResponse> call, Throwable t) {
Toast.makeText(c.getApplicationContext(),"Failure",Toast.LENGTH_LONG).show();
dismiss();
}
});
In response call it's showing:在响应呼叫它显示:
call: ExecuterCallAdapterFactory$ExecuterCallbackCall@5922" and in Throwable t it showing like "com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 27 path $.error.
call: ExecuterCallAdapterFactory$ExecuterCallbackCall@5922" 并在 Throwable 中显示为 "com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 27 path $.error.
You need to send a json body您需要发送一个 json 正文
Change your api method signature like below更改您的 api 方法签名,如下所示
@Headers({"Content-Type: application/json"})
@PUT("api/v1/update/{id}")
Call<ResponseBody> updateUser(@Path("id") int id, @Body UpdateResponse body);
public class UpdateResponse {
@SerializedName("id")
@Expose
private transient int id;
//..
Pass data in the body在正文中传递数据
UpdateResponse updateResponse = new UpdateResponse();
updateResponse.setName(name.getText().toString());
updateResponse.setSalary(salary.getText().toString());
updateResponse.setAge(age.getText().toString());
Call<UpdateResponse> call= Api.getClient().updateUser(idd, updateResponse);
It seems your retrofit code is fine.看来你的改造代码很好。 Could you share the whole Log with the error?
您能否与错误共享整个日志? I had a different issue with SPAN_EXCLUSIVE_EXCLUSIVE with related to an EditText.
我有一个与 EditText 相关的 SPAN_EXCLUSIVE_EXCLUSIVE 的不同问题。
The errors you are getting are not a result of your code;你得到的错误不是你的代码的结果; you probably are testing on a Samsung device that has Samsung's TouchWiz.
您可能正在具有三星 TouchWiz 的三星设备上进行测试。
I had the same errors, then I tested on a Nexus S (also by Samsung, but pure Android OS without TouchWiz) and I didn't get this error.我遇到了同样的错误,然后我在 Nexus S(也是三星的,但没有 TouchWiz 的纯 Android 操作系统)上进行了测试,但我没有收到此错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.