我有一个名为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
(中传递。