Skip to content

How to post url-encoded form in FeignClient from custom Feign.Builder? #2152

@sgpublic

Description

@sgpublic

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions