dromara / forest

A high-level and lightweight declarative HTTP client framework for Java. it makes sending HTTP requests in Java easier.
MIT License
1.71k stars 217 forks source link

在@Get 请求方式下,方法参数 @JSONBody 失效,没有生成Body数据块 #169

Closed developer-playable closed 1 year ago

developer-playable commented 1 year ago

@Get void some(@JSONBody User data) 或者 @Get void some(@JSONBody("name") name, @JSONBody("age") age)

请求的时候 参数数据不会放入 Body块中 @Post正常生成Body数据块,但某些场景需要使用@Get

developer-playable commented 1 year ago

看了一下源码 在 com.dtflys.forest.http.ForestRequestType 文件中

/**
 * 此类型请求是否一定需要Body
 *
 * @return {@code true}: 需要, 否则不需要
 */
public boolean isNeedBody() {
    return !this.equals(GET) && !this.equals(HEAD) && !this.equals(OPTIONS);
}

做了强制过滤限制,是否可以增加一个选项,让用户来决定是否要使用Body?

developer-playable commented 1 year ago

目前看主要问题是在 com.dtflys.forest.backend.okhttp3.executor.OkHttp3Executor 中 方法

protected void prepareMethodAndBody(Request.Builder builder, final LifeCycleHandler lifeCycleHandler) { ForestRequestType type = request.getType() == null ? ForestRequestType.GET : request.getType(); if (type.isNeedBody()) { BODY_BUILDER.buildBody(builder, request, lifeCycleHandler); } else { builder.method(type.getName(), null); } }

这块应该和 com.dtflys.forest.backend.body.AbstractBodyBuilder 中方法 buildBody

ForestBody reqBody = request.getBody(); boolean needRequestBody = request.getType().isNeedBody() || !reqBody.isEmpty() || !request.getMultiparts().isEmpty();

做一样的处理,不仅仅判断 isNeedBody(),而是如果有传body值就一样构建

最后临时对应处理,在配置文件中修改 后端HTTP框架 backend: okhttp3 改成 backend: httpclient

developer-playable commented 1 year ago

详细看了官方文档说明,明白了作者关于GET请求带body的可能问题 官方提供了灵活的backend切换方案,可以根据实际情况对应,为作者点赞