gpt4 book ai didi

android - Retrofit 的 Put 方法在 Android 中不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 09:19:29 25 4
gpt4 key购买 nike

我正在尝试使用 Retrofit2 实现一个 put 方法来更新演示 API 的记录,但它没有在回调中给我响应并跳转到 onFailure 函数。

  • 我正在使用演示 API ( http://dummy.restapiexample.com/update )
  • 我有一个响应类 UpdateResponse
  • 我有一个 Api 类和一个 ApiInterface
  • 和一个对话框而不是主要 Activity
  • 在ApiInterface中使用PUT方法有一个@path(id)和三个@fields(name,salary,age)

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)代码如下

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类代码如下

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

}

作为主要 Activity 代码的对话框如下

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

响应调用显示:

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.

最佳答案

你需要发送一个json body

如下所示更改您的 api 方法签名

@Headers({"Content-Type: application/json"})
@PUT("api/v1/update/{id}")
Call<ResponseBody> updateUser(@Path("id") int id, @Body UpdateResponse body);

制作编号 transient

public class UpdateResponse {
@SerializedName("id")
@Expose
private transient int id;
//..

在正文中传递数据

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

关于android - Retrofit 的 Put 方法在 Android 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57670567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com