当前位置: 首页 > 知识库问答 >
问题:

Put方法在Android中不起作用

柳宪
2023-03-14
  • 我正在使用演示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);

}
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“,并在可抛出的测试中显示”com.google.gson.stream.malformedJsonException:Unterminated object at line 1 column 27 path$.error“。

共有1个答案

孟嘉歆
2023-03-14

您需要发送一个json正文

如下所示更改api方法签名

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

使id瞬态化

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);
 类似资料:
  • PUT方法在django rest框架中不起作用。 模型。派克 对应视图 当我请求页面(GET)时,它显示相应的细节(配置文件细节)。但是当我提交页面(PUT)时,它仍然转到部分,而不是。当我使用REST视图时,它工作得很好。问题出在网页视图(html)上。我错过了什么?感谢任何帮助 HTML页面

  • 所以我需要邮递员的文件。问题是我的API需要身份验证,所以我不能使用Swagger来测试它们。当我从控制器中删除授权并使用Swagger时,它会工作,但使用Postman时,它会返回以下错误。 请求的邮递员标题:

  • 问题内容: 我已经为此拉了一段时间了。应该使用以下方法下载文件,并将其保存到硬盘驱动器上指定的位置。 另外,如果文件不存在,则应该为该文件创建目录。(如果该位置已经有另一个文件,则应该什么都不做)。但是,由于某种原因,mkdirs()方法从不创建目录。我已经尝试了从显式括号到显式制作父文件类的所有内容,似乎没有任何效果。我相当确定该驱动器是可写的,因为只有在确定驱动器之后才能调用该驱动器,在调试过

  • 我试图将所有对Rails后端进行api调用的服务整合为一个。它看起来是这样的: POST和GET工作正常,但PUT给了我

  • 我让troulbe通过jsp页面上的ajax函数将path参数输出到servlets doput方法。 我的使用Ajax的jsp页面: 我有get和post方法,因为它们在form action和method属性中以常规方式发送到servelt。 就我所知,Put和delete只能通过ajax或JQuery来完成,我似乎无法理解。 我已经在邮递员身上测试了这个方法,它非常有效。 我真的被困在这个问

  • 问题内容: 在下面的代码中不起作用: 在上面的代码中,我启动了一个检查对象是否不是的对象,并相应地取消了计时器。该对象由某些侦听器在任何时间设置。请参考并提出建议。我在这里做正确的事吗? Gautier Hayoun的解决方案 : 刚刚替代了CountDownTimer,可以从onTick内取消它:Github链接 – Gautier Hayoun 2010年12月12日,1:04 问题答案: G