【问题标题】:Put method of Retrofit is not working in Android改造的放置方法在Android中不起作用
【发布时间】:2019-12-31 09:25:00
【问题描述】:

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

  • 我正在使用演示 APi (http://dummy.restapiexample.com/update)
  • 我有一个响应类 UpdateResponse
  • 我有一个 Api 类和一个 ApiInterface
  • 和一个对话框而不是主要活动
  • 在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接口代码如下

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

}

下面是作为主要活动代码的对话框

                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" 并在 Throwable t 中显示为“com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 27 path $.error.

【问题讨论】:

标签: android retrofit2


【解决方案1】:

你需要发送一个json body

如下更改您的 api 方法签名

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

制作 id 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);

【讨论】:

  • 非常感谢,它成功了...再次非常感谢我的朋友
  • 你能否进一步解释为什么它没有给出回应,以便我......
  • 你的 api 希望数据以 json 格式传递。您将它们作为字段值发送。
  • 排除id在json body中序列化
  • 它会起作用,但最好不要向服务器发送任何不必要的字段。在这种情况下是瞬态的,从正文中排除 id 字段。
【解决方案2】:

看来您的改造代码没问题。您可以与错误共享整个日志吗?我遇到了与 EditText 相关的 SPAN_EXCLUSIVE_EXCLUSIVE 的不同问题。

您遇到的错误不是您的代码造成的;您可能正在具有三星 TouchWiz 的三星设备上进行测试。

我遇到了同样的错误,然后我在 Nexus S(也是三星的,但是没有 TouchWiz 的纯 Android 操作系统)上进行了测试,我没有收到这个错误。

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 2019-09-19
    • 1970-01-01
    • 2016-02-21
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多