feign
feign copied to clipboard
How to post url-encoded form in FeignClient from custom Feign.Builder?
Hello, the problem in short is that when using a custom Feign.Builder, I cannot use FeignClient to post a url-encoded form, it will post an empty string.
In particular, I have a FeignClient:
public interface FeignClientTest {
@PostMapping(value = "/test", consumes = {
MediaType.APPLICATION_FORM_URLENCODED_VALUE
})
String callTest(TestBody body);
record TestBody(
@FormProperty("test1") String test1,
@FormProperty("test2") String test2
){ }
}
And I create the instance by custom Feign.Builder:
@Import({FeignClientsConfiguration.class})
@Configuration
@RequiredArgsConstructor
public class FeignClientConfig {
private final Encoder encoder;
private final Decoder decoder;
private final Contract contract;
private Feign.Builder feignBuilder() {
return Feign.builder()
.encoder(new SpringFormEncoder())
.decoder(decoder)
.contract(contract)
.logLevel(Logger.Level.FULL);
}
@Bean
public FeignClientTest feignClientTest() {
return feignBuilder()
.logger(new Slf4jLogger(FeignClientTest.class))
.target(FeignClientTest.class, "http://127.0.0.1:8080/");
}
}
When I call it like this:
@Autowired
private FeignClientTest client;
@GetMapping("/something")
public String keep() {
return client.callTest(new FeignClientTest.TestBody("test1", "test2"));
}
I got these logs:
2023-08-11T18:55:52.421+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] ---> POST http://127.0.0.1:8080/test HTTP/1.1
2023-08-11T18:55:52.421+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] Content-Type: application/x-www-form-urlencoded; charset=UTF-8
2023-08-11T18:55:52.421+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest]
2023-08-11T18:55:52.422+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest]
2023-08-11T18:55:52.422+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] ---> END HTTP (0-byte body)
2023-08-11T18:55:52.452+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] <--- HTTP/1.1 200 (30ms)
2023-08-11T18:55:52.453+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] connection: keep-alive
2023-08-11T18:55:52.453+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] content-length: 12
2023-08-11T18:55:52.453+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] content-type: text/plain;charset=UTF-8
2023-08-11T18:55:52.453+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] date: Fri, 11 Aug 2023 10:55:52 GMT
2023-08-11T18:55:52.453+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] keep-alive: timeout=60
2023-08-11T18:55:52.453+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest]
2023-08-11T18:55:52.454+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] Hello World!
2023-08-11T18:55:52.454+08:00 DEBUG 53840 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] <--- END HTTP (12-byte body)
It seems that Feign post a empty body, is there anything I did wrong? Thank you in advance!
I change the TestBody
to this, it return to normal:
@AllArgsConstructor
@Getter
class TestBody {
@FormProperty("test1")
private String test1;
@FormProperty("test2")
private String test2;
}
And I find out that if I add final
to the field, it will disappear from body, like this:
@AllArgsConstructor
@Getter
class TestBody {
@FormProperty("test1")
private final String test1;
@FormProperty("test2")
private String test2;
}
logs:
2023-08-12T09:33:52.116+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] ---> POST http://127.0.0.1:8080/test HTTP/1.1
2023-08-12T09:33:52.116+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] Content-Length: 11
2023-08-12T09:33:52.116+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] Content-Type: application/x-www-form-urlencoded; charset=UTF-8
2023-08-12T09:33:52.116+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest]
2023-08-12T09:33:52.116+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] test2=test2
2023-08-12T09:33:52.116+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] ---> END HTTP (11-byte body)
2023-08-12T09:33:52.159+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] <--- HTTP/1.1 200 (41ms)
2023-08-12T09:33:52.159+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] connection: keep-alive
2023-08-12T09:33:52.159+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] content-length: 12
2023-08-12T09:33:52.159+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] content-type: text/plain;charset=UTF-8
2023-08-12T09:33:52.160+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] date: Sat, 12 Aug 2023 01:33:52 GMT
2023-08-12T09:33:52.160+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] keep-alive: timeout=60
2023-08-12T09:33:52.160+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest]
2023-08-12T09:33:52.160+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] Hello World!
2023-08-12T09:33:52.161+08:00 DEBUG 16164 --- [nio-8080-exec-1] c.e.openfeignclienttest.FeignClientTest : [FeignClientTest#callTest] <--- END HTTP (12-byte body)
I wonder if this is a bug or is that how openfeign is designed?
As I see PR was opened 2 weeks ago. https://github.com/OpenFeign/feign-form/pull/120 It should fix your problem.