如何在使用 Retrofit 的 GET 方法中发送请求体

4

我正在使用retrofit库进行网络调用。在这个过程中,我需要在GET方法中传递Body,但是当我传递它时,出现了错误。在Postman中,当我在GET方法中传递Body时,它可以正常工作。

@GET("http://192.168.0.141:3000/api/contacts/{page_num}/{limit}")
fun getAllContacts(@Path("page_num") page_num:Int,@Path("limit") limit:Int,@Body reqBody:ContactsInpRequest):Call<AllContactsDataResponse>

我尝试通过传递主体来调用get方法,但是出现了以下异常:

java.lang.IllegalArgumentException: 非 Body HTTP 方法不能包含 @Body。


Get方法不能有请求体。Get请求的参数附加在URL本身上。更多信息请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET。 - gprathour
@gprathour “虽然规范没有禁止,但语义未定义。” 您链接的文档并没有说 GET 请求不能有主体,它只是说其语义未定义。 - AndroidKotlinNoob
3个回答

7

与POST不同,GET方法不包含请求体。您可以在此了解更多有关REST方法的信息:https://restfulapi.net/http-methods/

编辑:我看到你说它在Postman中有效,所以看一下这个:

*GET请求可以有请求体吗?*

换句话说,任何HTTP请求消息都允许包含消息体,因此必须考虑到这一点来解析消息。然而,对于GET的服务器语义,被限制为如果有请求体,则请求体没有语义上的意义。... 是的,您可以发送带有GET请求体,但是它不应该具有任何意义。


4
java.lang.IllegalArgumentException: Non-body HTTP method cannot contain @Body

这意味着你的 @GET 或 @DELETE 不应该有 @Body 参数。你可以使用查询类型 URL 或路径类型 URL 或查询映射来满足你的需求。否则,你可以使用其他方法注释。

1
但是当我在Postman中使用GET方法传递body时,它可以正常工作。 - DSD TEJA
3
是的,邮递员已经更新了这个,但你不应该通过GET请求发送请求体,而是应该将HTTP方法更改为POST。 - Rakesh P.
至少在我的情况下,这不是一个选项。后端确实需要在GET请求中提供请求体。后端使用请求体中的值进行过滤和格式化。 - AndroidKotlinNoob

2
   @Headers("Content-Type: application/json")
@GET("helper-url")
fun getHelperUrl(
    @Query("api_token") apiToken: String,
    @Query("authtype") authType: String,
    @Query("channel") channel: String
): Call<ResponseHelperUrl>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接