Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

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.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – Microservices (eBook) (cat=Cloud/Spring Cloud)
Comments are closed on this article!