改造2:使用正文与查询



我有一个名为change的Web服务方法。我将UpdateStatusRequest对象发送到此网络服务,其定义如下:

public class UpdateStatusRequest {
    private String Status;
    public UpdateStatusRequest(String status) {
        Status = status;
    }
    public String getStatus() {
        return Status;
    }
}

当我使用以下 API 减速时:

@POST("StatusUpdate")
Call<Status> change(@Query("Status") String status);

然后调用statusApi.change(request.getStatus()),效果很好。当我传递Ready作为状态时,它会调用http://server-url/StatusUpdate?Status=Ready

但使用以下声明

@POST("StatusUpdate")
Call<Status> change(@Body UpdateStatusRequest status);

然后调用statusApi.change(request),它将调用http://server-url/StatusUpdate并在请求正文中发送Status。这将导致404状态代码,并Not Found错误提示。

我想知道我的第二次调用有什么问题(因为我认为@Body就像捆绑在同一对象中的几个@Query参数(?

在改造中, @Body@Query不同.

  • @Body – 将 Java 对象作为请求正文发送。
  • @Query - 追加到 URL 的查询参数。null值将被忽略。

@Field几乎与@Body标签相似。

  • @Field – 以表单编码的形式发送数据。@Field参数仅适用于开机自检

例如:

@POST("StatusUpdate")
Call<Status> change(@Field("Status") String Status);

但在您的情况下,您的服务器期望传入参数 URL(@Query) .

希望这个解释有所帮助。

@Body不像

几个@Query参数。这是在请求中发送数据的两种不同方式。

您的问题中几乎已经描述了差异。使用 @Query ,它将在 URL 后附加您传递的查询参数,如 http://server-url/StatusUpdate?Status=Ready .相反,如果您使用 @Body ,参数将被添加到正文请求中,因此您的 URL 将没有参数,如 http://server-url/StatusUpdate 中所示,并且您的正文请求将被Status=Ready

根据你得到的结果,你的服务器期望参数在URL(@Query(中传递。

相关内容

  • 没有找到相关文章

最新更新