Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用含有@Body的@Get方法报错:Non-body HTTP method cannot contain @Body. #55

Closed
leesonwei opened this issue Feb 23, 2021 · 7 comments

Comments

@leesonwei
Copy link

leesonwei commented Feb 23, 2021

Hi, 我的问题如下:
我使用retrofit调用Kafka Rest接口, 接口要求使用Get方法,并且须带有一个Json格式的body,我的定义如下
@Headers({"Content-Type:application/vnd.kafka.json.v2+json"}) @GET("consumers/{group_name}/instances/{instance_name}/offsets") Call<JsonNode> getOffsets(@Path("group_name") String groupName, @Path("instance_name") String instanceName, @Body RequestBody body);

执行时报错: Non-body HTTP method cannot contain @Body.
可否协助解决?

@chentianming11
Copy link
Collaborator

按照HTTP规范,get请求方式就是不支持请求体的😂
所以,不太理解“Get方法,并且须带有一个Json格式的body”具体指什么。

@leesonwei
Copy link
Author

leesonwei commented Feb 23, 2021

按照HTTP规范,get请求方式就是不支持请求体的😂
所以,不太理解“Get方法,并且须带有一个Json格式的body”具体指什么。

感谢您的回复:
我这里有个API,它的文档如下:
`GET /consumers/testgroup/instances/my_consumer/offsets HTTP/1.1
Host: proxy-instance.kafkaproxy.example.com
Content-Type: application/vnd.kafka.v2+json, application/vnd.kafka+json, application/json
#parameters
{
"partitions": [
{
"topic": "test",
"partition": 0
},
{
"topic": "test",
"partition": 1
}

]
}`
如果使用postman, 把parameters放到body中即可. 但是retrofit不支持.
所以请教应该如何用retrofit创建该请求?谢谢!

@chentianming11
Copy link
Collaborator

今天查了下,get确实可以传body,但是一般不推荐这么使用。我研究一下retrofit怎么传😂,之前没碰到过

@chentianming11
Copy link
Collaborator

chentianming11 commented Feb 24, 2021

@HTTP(method = "GET", path = "/user/get", hasBody = true)
试试这种方式看看~

@leesonwei
Copy link
Author

@HTTP(method = "GET", path = "/user/get", hasBody = true)
试试这种方式看看~

感谢, 这个方式报错信息意思一样. 还是通不过

@chentianming11
Copy link
Collaborator

@HTTP(method = "GET", path = "/user/get", hasBody = true)
试试这种方式看看~

感谢, 这个方式报错信息意思一样. 还是通不过

okhttp3自身不支持GET请求带请求体。源码如下:
image
image

作者给出了具体原因,可以参考这个issue:square/okhttp#3154

but,如果实在需要这么干,我想到一种方式,可以使用@HTTP(method = "get", path = "/user/get", hasBody = true)。使用小写get绕过上述限制。可以尝试一下!

@leesonwei
Copy link
Author

谢谢. 不过小写的get对我不起作用, kafka端不允许get请求,只允许GET请求. 不过我看了很多http客户端(apache httpclient, spring webclient等), 基本上都不支持get带body. 看来只能用最原始的方法了. 再次谢谢您的帮助!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants