1. Overview
In this tutorial, we'll learn how to make POST API requests with form-url-encoded data in the request body using Feign Client.
2. Ways to POST form-url-encoded Data
There are two different ways we can make POST form-url-encoded data. We need first to create a custom encoder and configure it for our Feign client:
class FormFeignEncoderConfig {
@Bean
public Encoder encoder(ObjectFactory<HttpMessageConverters> converters) {
return new SpringFormEncoder(new SpringEncoder(converters));
}
}
We'll use this custom class in our Feign client configuration:
@FeignClient(name = "form-client", url = "http://localhost:8085/api",
configuration = FormFeignEncoderConfig.class)
public interface FormClient {
// request methods
}
We're now finished with the Feign and bean configurations. Let's look into the request methods now.
2.1. Using POJO
We'll create a Java POJO class with all the form parameters as members:
public class FormData {
int id;
String name;
// constructors, getters and setters
}
We'll pass this object as a request body in the POST request.
@PostMapping(value = "/form", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
void postFormData(@RequestBody FormData data);
Let's verify our code; the request body should have the id and name as form-url-encoded data:
@Test
public void givenFormData_whenPostFormDataCalled_thenReturnSuccess() {
FormData formData = new FormData(1, "baeldung");
stubFor(WireMock.post(urlEqualTo("/api/form"))
.willReturn(aResponse().withStatus(HttpStatus.OK.value())));
formClient.postFormData(formData);
wireMockServer.verify(postRequestedFor(urlPathEqualTo("/api/form"))
.withHeader("Content-Type", equalTo("application/x-www-form-urlencoded; charset=UTF-8"))
.withRequestBody(equalTo("name=baeldung&id=1")));
}
2.2. Using Map
We can also use Map instead of POJO class to send the form-url-encoded data in the POST request body.
@PostMapping(value = "/form/map", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
void postFormMapData(Map<String, ?> data);
Note that the value of the Map should be ‘?'.
Let's verify our code:
@Test
public void givenFormMap_whenPostFormMapDataCalled_thenReturnSuccess() {
Map<String, String> mapData = new HashMap<>();
mapData.put("name", "baeldung");
mapData.put("id", "1");
stubFor(WireMock.post(urlEqualTo("/api/form/map"))
.willReturn(aResponse().withStatus(HttpStatus.OK.value())));
formClient.postFormMapData(mapData);
wireMockServer.verify(postRequestedFor(urlPathEqualTo("/api/form/map"))
.withHeader("Content-Type", equalTo("application/x-www-form-urlencoded; charset=UTF-8"))
.withRequestBody(equalTo("name=baeldung&id=1")));
}
3. Conclusion
In this article, we've seen how to make POST API requests with form-url-encoded data in the request body.
As always, the complete source code of the examples is available over on GitHub.